我有编译成 Win32 和 CE 5 dll 的 C++ 代码。看到我正在为这两个平台编译,我在 C++ 中使用预处理器定义在必要时进行隔离。
这两个 dll 都是从 C# 调用的,对于 Win32 应用程序是 .NET 3.5,对于 CE 应用程序是 .NET 2.0。
在 Win32 中一切正常,但我无法从 CE 中的 dll 函数返回。从 C# 调用的 dll 函数有一个结构指针作为参数,并且在 dll 函数中修改了包含字符串类型的结构内容。
这是 C++ 函数声明:
DWORD __declspec(dllexport) ExtSomeFunc(LPTSTR szReader, MY_STRUCT* myStruct)
在 C# 中:
[DllImport("somelibrary.dll", EntryPoint = "ExtSomeFunc", CharSet = CharSet.Unicode)]
private static extern uint ExtSomeFunc([MarshalAs(UnmanagedType.LPWStr)] string szReaderName, ref MY_STRUCT myStruct);
这是 C++ 中的结构声明:
struct MY_STRUCT
{
LPTSTR szString1;
LPTSTR szString2;
MY_STRUCT()
{
szString1 = new wchar_t[32];
szString2 = new wchar_t[20];
}
~MY_STRUCT()
{
delete []szString1;
delete []szString1;
}
};
在 C# 中:
public struct MY_STRUCT
{
[MarshalAsAttribute(UnmanagedType.LPWStr, SizeConst = 32)]
public string szString1;
[MarshalAsAttribute(UnmanagedType.LPWStr, SizeConst = 20)]
public string szString2;
public MY_STRUCT(string szInit)
{
this.szString1 = szInit;
this.szString1 = szInit;
}
}
下面是函数在 C# 中的调用方式:
string szReader = "SomeDeviceName";
uint uiRet = 0;
MY_STRUCT myStruct = new MY_STRUCT("");
uiRet = ExtSomeFunc(szReader, ref myStruct);
所以发生的事情是,如果我尝试用长度大于 6 的字符串填充结构字符串,
wcscpy(myStruct->szString1, L"1234567");
或者
StringCchCopyW(myStruct->szString1, sizeReq+1, L"abcdefg");
C# 永远不会从 dll 函数返回。使用一些测试文件日志记录,我可以看到字符串已填充并且函数完成,但 C# 只是在它应该返回时挂起,我需要重启 CE 设备才能恢复。
这几天一直在敲我的头。这显然是 .NET 2.0 或 CE 5 的问题,只是无法弄清楚哪个不是如何修复它。
提前致谢!