包装器c#使用非托管dll

包装器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

我正在制作一个包装器来读取TDM和TDMS文件,但我有一个问题

        [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,它可以工作