C#调用非托管C驱动程序(DLL)

时间:2013-06-07 07:54:31

标签: c# c marshalling unmanaged

我真的不确定我做错了什么。我正在将一个字符串传递给我用C#编写的Cll作为网络状态下的大量示例..由于某种原因,字符串在C dll中显示为NULL。我知道我做错了什么?

C:

 extern __declspec(dllexport) void Cmd(long CmdType,long DataPar, const char *DataStr);

 void Cmd(long CmdType,long DataPar,const char *DataStr)
 {
     // DataStr is NULL here even when passing a string with data in it
 }

C#:

    [DllImport(@"pjsua-i386-Win32-vc8-Debug.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]

    public static extern void Cmd(long CmdType, long DataPar,[MarshalAs(UnmanagedType.LPStr)]String s);

    Cmd(1,0,"TEST");

我还尝试了其他一些东西,比如IntPtr和整个字符串的编组,但所有结果都是NULL。还有其他一些东西。

2 个答案:

答案 0 :(得分:2)

在Microsoft C ++和C中,在32位和64位构建上,long只有32位。

但是,在C#中,long总是64位。

所以我认为正在发生的是,C#调用被压入堆栈的两个64位长的一些字节被弹出作为C ++中的Data*

因为您要推送的第二个参数是0,所以会发生值为0的字节用于指针,因此它为空。

将声明更改为int而不是long以解决您的问题。

答案 1 :(得分:0)

您是否尝试过以下选项:

    [DllImport(@"pjsua-i386-Win32-vc8-Debug.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
    public static extern void Cmd(int CmdType, int DataPar,IntPtr s);

    Cmd(1,0,Marshal.StringToHGlobalAnsi(str));