使用非托管dll的包装器c#

时间:2010-05-08 13:17:51

标签: c# dll wrapper

我正在制作一个包装器来读取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。来自.h文件的def

int __stdcall DDC_GetNumChannelGroups (DDCFileHandle file,unsigned int *numChannelGroups);

第二个参数是问题。 似乎unsigned int *!= uint。

有没有人知道如何从dll调用此函数?

http://forums.ni.com/ni/board/message?board.id=60&thread.id=11821

1 个答案:

答案 0 :(得分:2)

这是宣布错误的第一个参数。抛出堆栈帧并阻止非托管代码正确读取第二个参数的指针。 “long”是64位,DDCFileHandle几乎肯定是32位操作系统上的32位指针。

将参数声明更改为IntPtr。您还需要更改返回该句柄的函数的声明。