如何将C#类似字符串的变量传递给sbyte *参数?

时间:2018-07-06 09:38:40

标签: c# c++ string cross-language sbyte

我继承了带有相关头文件的C ++ DLL,并声明了类似的功能

int func1(int i);
int func2(char* s);

我还继承了参考VC ++参考类,该参考类包装了要在C#环境中使用的上述DLL

public ref class MyWrapperClass
{
    int func1_w(int i)
    {
        return func1(i);
    }
    int func2_w(char* s)
    {
        return func2(s);
    }
}

在我的C#应用​​程序中,我可以使用func1_w(int i),但是我不明白如何将字符串传递给func2_w(sbyte * s):我遇到一个错误,因为我无法获得指向sbyte。我将C#项目设置为不安全,并声明该函数为不安全。

如何将sbyte *参数传递给函数func2_w?

2 个答案:

答案 0 :(得分:2)

正如我在评论中所说,这可能是我见过的最愚蠢的包装器。您必须手动分配ansi字符串。两种方式:

string str = "Hello world";

IntPtr ptr = IntPtr.Zero;

try
{
    ptr = Marshal.StringToHGlobalAnsi(str);

    // Pass the string, like:
    mwc.func2_w((sbyte*)ptr);
}
finally
{
    Marshal.FreeHGlobal(ptr);
}

另一种方式,使用Encoding.Default(但请注意终止\0的特殊处理)

string str = "Hello world";

// Space for terminating \0
byte[] bytes = new byte[Encoding.Default.GetByteCount(str) + 1];
Encoding.Default.GetBytes(str, 0, str.Length, bytes, 0);

fixed (byte* b = bytes)
{
    sbyte* b2 = (sbyte*)b;
    // Pass the string, like:
    mwc.func2_w(b2);
}

答案 1 :(得分:0)

最后,我使用了以下方法:

sbyte[] buffer = new sbyte[256];
String errorMessage;
fixed (sbyte* pbuffer = &buffer[0])
{
    megsv86bt_nips.getLastErrorText(pbuffer);
    errorMessage = new string(pbuffer);
};

有人将其张贴在我的问题的评论中,但我看不到了。