как вызвать функцию C из C #с выходным параметром WCHAR *?

У меня есть небольшая проблема с маршалингом, и я просто не могу понять это сам. Я искал эту тему, но пока не повезло, поэтому в основном я пытаюсь вызвать неуправляемую функцию C из моего управляемого приложения C #. Сигнатура функции C выглядит так:

long MyFunction(WCHAR* upn, long upnSize, WCHAR* guid, long* guidSize);

У меня нет доступа к файлу.dll, я просто знаю, что функция открыта для использования, и я знаю, что функция должна делать, но я не знаю, что происходит внутри, поэтому функция получает WCHAR *upn, содержащий UserPricipalName и long с длиной предоставленного имени участника-пользователя. Также передается указатель WCHAR, где функция возвращает соответствующий GUID, связанный с переданным UPN. Указатель guidSize предоставляет размер указателя, если он слишком мал, записанный GUID не записывается полностью. Если все пойдет нормально, функция должна вернуть 0 (, такого еще не было,при вызове из c#)

Теперь мои попытки вызвать и вызвать эту функцию выглядят так:

[DllImport(@"MyDll.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern long MyFunction(IntPtr upnPtr, long upnSize, [Out, MarshalAsAttribute(UnmanagedType.LPWStr) ] StringBuilder guidPtr, IntPtr guidSizePtr);


//my attempt to call the Dll's exposed function
string upn = foo@bar.com;
long upnSize = upn.Length;
IntPtr upnPtr = Marshal.StringToHGlobalUni(upn);

IntPtr guidSizePtr = Marshal.AllocHGlobal(sizeof(long));
Marshal.WriteInt32(GuidSizePtr, 128);
var guidSB = new StringBuilder(128);

result = MyFunction(upnPtr, upnSize, guidSB, guidSizePtr);

в результате я получаю AccessViolationException. Я играл со многими вариантами вызова функции, но мне никогда не удавалось получить 0 в качестве возвращаемого значения, и мне никогда не удавалось прочитать GUID, как я должен был сделать.

Любая помощь в этом будет оценена по достоинству.

5
задан Alanight 4 March 2015 в 02:58
поделиться