如何将类似 C# 字符串的变量传递给 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(:我收到一个关于我无法获取指向字节的指针的错误。我将 C# prject 设置为不安全,并将该函数声明为不安全。

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

正如我在评论中所说,可能是我见过的最愚蠢的包装器。您必须手动分配 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(但请注意终止的特殊处理(

string str = "Hello world";
// Space for terminating 
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);
}

最后我使用了以下方法:

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

有人在我的问题评论中发布了它,但我再也看不到它了。

相关内容

  • 没有找到相关文章

最新更新