-1

我有编译成 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 的问题,只是无法弄清楚哪个不是如何修复它。

提前致谢!

4

1 回答 1

0

尝试在游览 c# struct 定义之前添加:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
  • 包值必须是您的结构字节对齐。
于 2013-04-25T08:40:37.547 回答