C#调用非托管C驱动程序(dll)
我真的不确定我做错了什么。我正在将一个字符串从C#传递到我用C编写的dll,就像网络状态中的许多示例一样。由于某种原因,该字符串在C dll中显示为NULL。知道我做错了什么吗 C: C#:C#调用非托管C驱动程序(dll),c#,c,marshalling,unmanaged,C#,C,Marshalling,Unmanaged,我真的不确定我做错了什么。我正在将一个字符串从C#传递到我用C编写的dll,就像网络状态中的许多示例一样。由于某种原因,该字符串在C dll中显示为NULL。知道我做错了什么吗 C: C#: 我也尝试过其他方法,比如IntPtr和跨字符串编组,但结果都是NULL。还有一组其他的东西。 < P>在微软C++和C中,在32位和64位的构建中,长只有32位。 然而,在C#中,long总是64位 我认为发生的是C++中调用的两个64位长的字节中的一些字节被作为C++中的数据*/COD>弹出, 因为您正在
我也尝试过其他方法,比如IntPtr和跨字符串编组,但结果都是NULL。还有一组其他的东西。 < P>在微软C++和C中,在32位和64位的构建中,长只有32位。 然而,在C#中,long总是64位
我认为发生的是C++中调用的两个64位长的字节中的一些字节被作为C++中的<代码>数据*/COD>弹出,
因为您正在推送的第二个参数是0,所以值为0的字节恰好用于指针,因此它是空的将声明更改为
int
而不是long
,以解决您的问题。您是否尝试了以下选项:
[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));
[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");
[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));