Как перевести Unicode-строку из c# в c / c ++ dll - PullRequest
1 голос
/ 22 января 2020

Я вызываю функцию C / C ++ DLL из C# и у меня возникает проблема, когда функция имеет wchar_t* parameter.
Я изменил параметр с wchar_t* на char*, тогда все в порядке.
Почему? как заставить работать хорошо с wchar_t*?

Вот мой код:

C#

[DllImport("kernel32")]
private static extern IntPtr LoadLibraryEx(string fileName, IntPtr hFile, uint loadFlag);

[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr lib, string funcName);

[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr lib);

delegate void DllTestFunc(string str, byte[] data, int length);

static void Main(string[] args)
{   
    var dllInstance = LoadLibraryEx(@"D:\Development\NativeDll\x64\Debug\NativeDll.dll", IntPtr.Zero, 0x0008);
    var ptr = GetProcAddress(dllInstance, "DllTestFunc");
    var func = Marshal.GetDelegateForFunctionPointer<DllTestFunc>(ptr);
    var inputStr = @"E:\test.dat";
    var data = new byte[100];
    data[0] = 0x55;
    func(inputStr, data, 2020);
    FreeLibrary(dllInstance);
}

C / C ++ Код:

void __stdcall DllTestFunc(wchar_t* str1, unsigned char* data, const int length)

{

    cout << str1 << endl;

    cout << int(data[0]) << endl;

    cout << length << endl;**strong text**

}

Поскольку мне нужно использовать wchar_t*, как его решить?

1 Ответ

0 голосов
/ 22 января 2020

Возможно, вам необходимо указать маршаллеру, как передать аргумент str вашего делегата:

delegate void DllTestFunc([MarshalAs(UnmanagedType.LPWStr)] string str, byte[] data, int length);
...