从本机C ++ DLL传递字符串到C#应用程序(Passing String from Native

2019-09-17 16:56发布

我已经用C ++编写的DLL。 上述功能之一写入的字符阵列。

C ++函数

EXPORT int xmain(int argc, char argv[], char argv2[])
{
    char  pTypeName[4096];
    ...
    //Other pTypeName ends up populated with "Portable Network Graphics"
    //This code verifies that pTypeName is populated with what I think it is:
    char szBuff[64];
    sprintf(szBuff, pTypeName, 0);
    MessageBoxA(NULL, szBuff, szBuff, MB_OK);
    //The caption and title are "Portable Network Graphics"

    ...
    //Here, I attempt to copy the value in pTypeName to parameter 3.
    sprintf(argv2, szBuff, 0);

    return ret;
}

C#导入

    //I believe I have to use CharSet.Ansi because by the C++ code uses char[],
    [DllImport("FirstDll.dll", CharSet=CharSet.Ansi)]
    public static extern int xmain(int argc, string argv, ref string zzz);

C#功能

private void button2_Click(object sender, EventArgs e)
{
    string zzz = ""; 
    int xxx = xmain(2, @"C:\hhh.bmp", ref zzz);
    MessageBox.Show(zzz);

    //The message box displays
    //MessageBox.Show displays "IstuÈst¼ÓstÄstlÄstwÄstiÑstõÖstwÍst\
    // aÖst[ÖstÃÏst¯ÄstÐstòÄstŽÐstÅstpÅstOleMainThreadWndClass"

}

我已尝试通过引用传递从C#的参数和有C ++ DLL填充参数。 尽管我已经验证该值在DLL正确,胡言乱语被传递到C#应用程序。

我能做些什么来写正确的字符串值C#字符串?

Answer 1:

使用StringBuilder传递一个字符数组本地代码可以填写(参见固定长度字符串缓冲器 )。

声明函数:

[DllImport("FirstDll.dll", CharSet=CharSet.Ansi)]
public static extern int xmain(int argc, string argv, StringBuilder argv2);

用它:

// allocate a StringBuilder with enough space; if it is too small,
// the native code will corrupt memory
StringBuilder sb = new StringBuilder(4096);
xmain(2, @"C:\hhh.bmp", sb);
string argv2 = sb.ToString();


Answer 2:

给一些其他的信息到dllimport的电话。 看看我自己的下面的例子:

[DllImport("tcpipNexIbnk.dll", EntryPoint = "SendData", CallingConvention = CallingConvention.Cdecl)]
    public static extern int Send([MarshalAs(UnmanagedType.LPWStr)]string message);

请注意两个问题,在CallingConvention参数:CallingConvention = CallingConvention.Cdecl)

请使用,因为它是。

然后,仅落后于C#字符串类型,你可以使用的MarshalAs指令不同的非托管类型,将在您的C#字符串参数转换为你在你的C ++程序有本地字符串类型玩法:

public static extern int Send([MarshalAs(UnmanagedType.LPWStr)]string message);

希望能帮助到你。



文章来源: Passing String from Native C++ DLL to C# App