Dllimport метод, возвращающий точку в структуру
У меня есть библиотека dll c, которую я пытаюсь вызвать из c# с помощью Dllimport.
Я продолжаю получать "попытку чтения или записи в защищенную память" при вызове функции. Я попробовал почти все, что мог придумать, так что любая помощь будет оценена по достоинству.
Вот код на языке Си
struct DocProcHandle { unsigned long Size;//sizeof(DocProcHandle) void* UserHandle; const char* DeviceName; unsigned long DeviceTypeId; unsigned long DeviceState; unsigned long OpenFlags; void* Reserved1; }; typedef struct DocProcHandle *DPHandle; BPS_DP_API DPHandle CDECLCALL_CONV DPOpenHandleEx(unsigned long deviceTypeId, const char* trkBaseWrite, const char* trkBaseConfig, const unsigned long openFlags);
Вот мой код c#
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] struct DocProcHandle { ulong Size;//sizeof(DocProcHandle) IntPtr UserHandle; [MarshalAs(UnmanagedType.LPStr)] string DeviceName; ulong DeviceTypeId; ulong DeviceState; ulong OpenFlags; IntPtr Reserved1; }; [DllImport("DocProc.dll", EntryPoint = "DPOpenHandleEx", ExactSpelling = false, CallingConvention =CallingConvention.Cdecl)] private static extern IntPtr DPOpenHandleEx(ulong deviceTypeId, [MarshalAs(UnmanagedType.LPStr)] string trkBaseWrite, [MarshalAs(UnmanagedType.LPStr)] string trkBaseConfig, [In] ulong openFlags); static public void OpenHandle() { string s = "C:\\temp"; IntPtr a = DPOpenHandleEx((ulong)7, s, s, 0); //DocProcHandle h = (DocProcHandle)Marshal.PtrToStructure(a, typeof(DocProcHandle)); }
Он взрывается вызовом метода DPOpenHandleEx.
Любые идеи приветствуются.
Что я уже пробовал:
Я добавил дополнительные элементы в строку dllimport, чтобы еще больше ее усовершенствовать.
Изменение типа возвращаемого значения маршалирует его.
Richard MacCutchan
Вы уверены, что параметры, которые вы передаете функции, верны?
lewisv
Вы можете увидеть файл заголовка. Я думаю, что мой dllimport выглядит так, как будто он будет работать для данной функции.
Что касается того, что моя тестовая программа передает, то они такие же, как пример приложения c, которое использует ту же библиотеку dll и метод.
Ján Štrbík
У меня точно такая же проблема.. Так или иначе, вы ее решили?