Я хочу вызвать следующую функцию из моего управляемого кода:
short LS_LoadConfig(LS_ID SensorID,LPVARIANT varConfigPathFile,BOOL bInit)
Вот как я объявляю функцию extern в моем классе C #:
[DllImport("LineSensor.dll", EntryPoint = "#16")]
private static extern Int16 LS_LoadConfig(
Int16 deviceId,
IntPtr variantFilePath,
int init);
И вот какЯ создаю экземпляр VARIANT и получаю указатель на него.Затем я вызываю функцию C #:
string filepath = @"C:\Windows\ ...";
IntPtr variantFilePath = Marshal.AllocCoTaskMem(200);
Marshal.GetNativeVariantForObject(filepath, variantFilePath);
LS_LoadConfig(device.Id, variantFilePath, initLineSensor);
Проблема заключается в том, что я продолжаю получать сообщения об ошибках, такие как «вызов функции LS_LoadConfig разбалансирует стек, проверьте, что параметры соответствуют неуправляемой подписи».
Похоже, что проблема вызвана вторым аргументом "variableFilePath", так как он неправильно распределен и его размер в неуправляемой куче не соответствует одному из адресов (32-битный в моем случае).Я попытался изменить тип в сигнатуре функции C # с IntPtr на int следующим образом:
[DllImport("LineSensor.dll", EntryPoint = "#16")]
private static extern Int16 LS_LoadConfig(
Int16 deviceId,
int variantFilePath,
int init);
Я попытался вызвать функцию, передав случайное число, и она стала немного лучше, я только что получил ошибку "нарушение доступа к памяти".Очевидно, что случайное число не было действительным адресом.
Кто-нибудь знает решение этой проблемы?
Спасибо за любую полезную информацию.