我有编译进Win32和CE 5 dll的C++代码。看到我正在编译这两个平台,我在C++中使用预处理器定义在必要时进行隔离。问题从C#传递结构,并在CE上的非托管C++ DLL中修改
这两个dll都是从C#,.NET 3.5 for Win32应用程序和.NET 2.0 for CE应用程序调用的。
一切都在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的东西,只是不知道如何解决它。
在此先感谢!
长度是固定的,所以我能得到其与该工作在C++结构'wchar_t的szString1 [SOME_LEN];'和这个在C#结构'[MarshalAsAttribute(UnmanagedType.ByValTStr,SizeConst = SOME_LEN) ]' – alexsd 2013-04-26 16:27:16