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

时间:2012-12-21 16:07:06

标签: c# pointers pinvoke

  

可能重复:
  Passing char pointer from C# to c++ function

我有这类问题:

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

int myfunction ( char* Buffer, int * rotation)

缓冲区参数必须填充空格字符(0x20 hex)

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

char* buffer = (char *)malloc(256);
memset(buffer,0x20,256);
res = myfunction (buffer, rotation);

我正试图从C#调用此函数。

这是我的p / invoke声明:

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

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

StringBuilder buffer = new StringBuilder(256);
buffer.Append(' ', 256);
...
myfunction(buffer, rotation);

但它不起作用....

任何人都可以帮助我?

感谢。

2 个答案:

答案 0 :(得分:5)

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

我会这样写:

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

然后这样称呼:

StringBuilder buffer = new StringBuilder(new String(' ', 256));
int rotation = ...;
int retVal = myfunction(buffer, ref rotation);

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

答案 1 :(得分:0)

尝试通过引用传递rotation。您可能还需要编辑myfunction的签名。如果方法有效,请告诉我。

myfunction (buffer.ToString(), ref rotation);