在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的问题,只是不知道该怎么解决。

提前感谢!

在ce5上从c#传递结构体并在非托管c++ dll中修改的问题

尝试添加前游c#结构定义:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
  • 包的值必须是你的结构字节对齐。