【问题标题】:How to transfer unicode string from c# to c/c++ dll如何将 unicode 字符串从 c# 传输到 c/c++ dll
【发布时间】:2020-05-08 14:38:30
【问题描述】:

我从 C# 调用 C/C++ DLL 函数,但当函数具有 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*,如何解决?

【问题讨论】:

  • 使用MarshalAs(UnmanagedType.LPWStr)属性
  • 是否需要在运行时加载库(使用LoadLibrary)或者直接通过[DllImport("...NativeDll.dll")]导入方法?
  • 您可以使用DllImport 让生活变得更轻松。如果您需要LoadLibraryExLOAD_WITH_ALTERED_SEARCH_PATH 标志,那么只需在调用任何DllImport 函数之前调用LoadLibraryEx
  • 使用 marshal 是最好的答案。谢谢

标签: c# c++ dll pinvoke


【解决方案1】:

您可能需要告诉编组器如何传输您的委托的 str 参数:

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

【讨论】:

    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    相关资源
    最近更新 更多