将char指针从C#传递给C++

bet*_*use 3 c# pinvoke pointers

可能重复:将
char指针从C#传递给c ++函数

我有这种类型的问题:

我有一个带有此签名的c ++函数:

int myfunction ( char* Buffer, int * rotation)
Run Code Online (Sandbox Code Playgroud)

缓冲区参数必须填充空格字符(0x20十六进制)

在C++中,我可以简单地解决这个问题:

char* buffer = (char *)malloc(256);
memset(buffer,0x20,256);
res = myfunction (buffer, rotation);
Run Code Online (Sandbox Code Playgroud)

我试图从C#调用此函数.

这是我的p/invoke声明:

[DllImport("mydll.dll", CharSet = CharSet.Ansi, SetLastError = true)]
private static extern unsafe int myfunction (StringBuilder Buffer, int* RotDegree);
Run Code Online (Sandbox Code Playgroud)

在我的C#类中,我试图这样做:

StringBuilder buffer = new StringBuilder(256);
buffer.Append(' ', 256);
...
myfunction(buffer, rotation);
Run Code Online (Sandbox Code Playgroud)

但它不起作用....

有人可以帮帮我吗?

谢谢.

Dav*_*nan 5

你的p/invoke看起来不太合适.它应该(推测)使用Cdecl调用约定.你不应该使用SetLastError.并且不需要不安全的代码.

我会这样写:

[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl)]
private static extern int myfunction(StringBuilder Buffer, ref int RotDegree);
Run Code Online (Sandbox Code Playgroud)

然后像这样称呼它:

StringBuilder buffer = new StringBuilder(new String(' ', 256));
int rotation = ...;
int retVal = myfunction(buffer, ref rotation);
Run Code Online (Sandbox Code Playgroud)

我没有指定,CharSet因为Ansi是默认值.