0

我真的不确定我做错了什么。我正在将一个字符串从 C# 传递给我用 C 编写的 dll,作为网络状态上的许多示例。由于某种原因,该字符串在 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 相同。还有一堆其他的东西。

4

2 回答 2

2

在 Microsoft C++ 和 C 中,在 32 位和 64 位构建中,long 仅为 32 位。

但是,在 C# 中,long 始终是 64 位。

所以我认为正在发生的是,由 C# 调用推入堆栈的两个 64 位 long 的一些字节正在像Data*C++ 中的那样被弹出。

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

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

于 2013-06-07T08:01:30.783 回答
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));
于 2013-06-07T10:37:45.963 回答