MarshalDirectiveException в Unity при маршалинге int[] в SafeArray ⇐ C#
-
Anonymous
MarshalDirectiveException в Unity при маршалинге int[] в SafeArray
Маршалинг int[] в SafeArray, похоже, ведет себя по-разному в Unity и в автономном приложении .NET.
У меня есть COM-dll, определяющая интерфейс
[ComImport] Публичный интерфейс Калибровка { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] [возврат: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_INT)] Массив getInputKey(); } В моем сценарии C#, либо в Unity, либо в автономном приложении .NET, я создал класс, который наследуется от Calibration
публичный класс MyCalibration: Калибровка { частный статический только для чтения int[] _inputs = new[] {0}; общественная недействительность doSomethingElse() { // Что-нибудь } общедоступный массив getInputKey() { вернуть _входные данные; } } У другого COM-объекта есть метод
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] void setCalibrationInterface([MarshalAs(UnmanagedType.Interface), In] Calibration ical); Я создал экземпляр MyCalibration и использовал его в качестве аргумента метода setCalibrationInterface.
var myCal = new MyCalibration(); util.setCalibrationInterface(myCal); doSomethingElse() вызывается без проблем. Однако в Unity я получил следующее исключение, когда getInputKey() вызывается в консоли Unity:
MarshalDirectiveException: макет типа System.Array должен быть последовательным или явным. (собственная оболочка для управляемого) SREYELINKLib.ICalibration.getInputKey(intptr,System.Array&) UnityEngine.c:b__0_0(Object, UnhandledExceptionEventArgs) Есть идеи, как это исправить?
Маршалинг int[] в SafeArray, похоже, ведет себя по-разному в Unity и в автономном приложении .NET.
У меня есть COM-dll, определяющая интерфейс
[ComImport] Публичный интерфейс Калибровка { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] [возврат: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_INT)] Массив getInputKey(); } В моем сценарии C#, либо в Unity, либо в автономном приложении .NET, я создал класс, который наследуется от Calibration
публичный класс MyCalibration: Калибровка { частный статический только для чтения int[] _inputs = new[] {0}; общественная недействительность doSomethingElse() { // Что-нибудь } общедоступный массив getInputKey() { вернуть _входные данные; } } У другого COM-объекта есть метод
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] void setCalibrationInterface([MarshalAs(UnmanagedType.Interface), In] Calibration ical); Я создал экземпляр MyCalibration и использовал его в качестве аргумента метода setCalibrationInterface.
var myCal = new MyCalibration(); util.setCalibrationInterface(myCal); doSomethingElse() вызывается без проблем. Однако в Unity я получил следующее исключение, когда getInputKey() вызывается в консоли Unity:
MarshalDirectiveException: макет типа System.Array должен быть последовательным или явным. (собственная оболочка для управляемого) SREYELINKLib.ICalibration.getInputKey(intptr,System.Array&) UnityEngine.c:b__0_0(Object, UnhandledExceptionEventArgs) Есть идеи, как это исправить?
Мобильная версия