在ce5上从c#传递结构体并在非托管c++ dll中修改的问题
本文关键字:c++ dll 问题 修改 上从 ce5 结构体 | 更新日期: 2023-09-27 18:10:30
我有编译成Win32和ce5 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的字符串填充struct strings
wcscpy(myStruct->szString1, L"1234567");
或
StringCchCopyW(myStruct->szString1, sizeReq+1, L"abcdefg");
c#永远不会从dll函数返回。使用一些测试文件日志记录,我可以看到字符串被填充,函数完成,但是c#只是挂起,当它应该返回,我需要电源循环CE设备恢复。
这几天我一直在敲我的头。这显然是。net 2.0或CE 5的问题,只是不知道该怎么解决。
提前感谢!
尝试添加前游c#结构定义:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
- 包的值必须是你的结构字节对齐。