包装器c#使用非托管dll
我正在制作一个包装器来读取TDM和TDMS文件,但我有一个问题包装器c#使用非托管dll,c#,dll,wrapper,C#,Dll,Wrapper,我正在制作一个包装器来读取TDM和TDMS文件,但我有一个问题 [DllImport(lib, CharSet = CharSet.Auto)] static extern int DDC_OpenFileEx( [MarshalAs(UnmanagedType.LPStr)] string filePath, [MarshalAs(UnmanagedType.LPStr)] string
[DllImport(lib, CharSet = CharSet.Auto)]
static extern int DDC_OpenFileEx(
[MarshalAs(UnmanagedType.LPStr)]
string filePath,
[MarshalAs(UnmanagedType.LPStr)]
string fileType,
int read_only,
ref long file);
很好,但是
[DllImport(lib, CharSet = CharSet.Auto, SetLastError = true)]
static extern int DDC_GetNumChannelGroups(long file,
[MarshalAs(UnmanagedType.U4)]
ref int numChannelGroups);
int numGru = 0;
errCode = ReadTDM.DDC_GetNumChannelGroups(file,ref numGru);
System.Console.WriteLine("Error Code {0} GetNumChannelGroups", errCode);
给出错误-6202,//传递给库的参数无效。
我试过ref uint,uint*(不安全),UIntPtr。文件中的def
int __stdcall DDC_GetNumChannelGroups (DDCFileHandle file,unsigned int *numChannelGroups);
第二个参数是问题。
似乎unsigned int*!=乌因特
有人知道如何从dll中调用这个函数吗
这是第一个被宣布为错误的参数。这会抛出堆栈框架,并阻止非托管代码正确读取第二个参数的指针。“long”是64位,DDCFileHandle几乎可以肯定是一个指针,在32位操作系统上是32位
将参数声明更改为IntPtr。您还需要更改返回该句柄的函数的声明。在这些特殊情况下,您不需要指定
marshallas
:LPStr
是默认值,U4
在这里不做任何事情,因为int
和uint
大小相同。删除属性是一个好主意,但随后使用查塞特·安西思:很多。我有一个错误的.h文件。这一个用于MatlabTypeDef长DDCFileHandle;typedef长DDC通道组句柄;typedef长DDC通道手柄;我将句柄改为int,它可以工作