【发布时间】:2014-03-07 18:12:26
【问题描述】:
我正在尝试将 C DLL 导入我的 C# 项目。 .h 代码如下所示:
_declspec(dllexport) LRESULT CALLBACK SensFindDeviceW(LONG n, LPWSTR pwszMask, PSENSDEVICEW pDevice);
_SENSDEVICEW 结构:
typedef struct _SENSDEVICEW
{
WCHAR szSerialNo[32];
WCHAR szDeviceID[32];
LONG nIndex;
} SENSDEVICEW, * PSENSDEVICEW;
所以到目前为止我在 C# 中所做的是使用 DLLImport:
[DllImport("dll/UFTAccess.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
static extern unsafe long SensFindDeviceW(long n, String pszMask, SENSDEVICEW pDevice);
定义结构:
[StructLayout(LayoutKind.Sequential)]
unsafe struct SENSDEVICEW
{
public char[] szSerialNo;
public char[] szDeviceID;
public long nIndex;
}
并尝试在方法中使用它:
SENSDEVICEW myDevice = new SENSDEVICEW();
myDevice.szSerialNo = new char[32];
myDevice.szDeviceID = new char[32];
long test = SensFindDeviceW(1, "", myDevice);
有了这个System.Runtime.InteropServices.SafeArrayTypeMismatchException。
如果我不初始化数组,我会收到堆栈不平衡错误。
我已经尝试过使用 stringbuilder(它不起作用)并像这样编组字符数组:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
string szSerialNo;
但它会导致堆栈不平衡。
也许你们中的任何人都知道我还能尝试什么来让 dll 工作?
【问题讨论】: