在C ++中,
__declspec(dllexport)
void charArrayTest(void * ptr)
{
char*c = (char*)ptr;
c[0] = 97;
c[1] = 0;
c[2] = 97;
c[3] = 0;
}
这适用于C#字节数组:
[DllImport("KutuphaneCL", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
public static extern void charArrayTest(byte[] arr);
byte[] tst = new byte[20];
charArrayTest(tst);
Console.WriteLine(tst[0]);
Console.WriteLine(tst[1]);
Console.WriteLine(tst[2]);
Console.WriteLine(tst[3]);
Console.WriteLine(tst[4]);
Console.WriteLine(tst[5]);
输出:
97 0 97 0 0 0
但是当我从C#端尝试char数组时,
[DllImport("KutuphaneCL", CallingConvention = CallingConvention.Cdecl, ExactSpelling = true)]
public static extern void charArrayTest(char[] arr);
//simpleCharSingleGPU();
char[] tst = new char[20];
charArrayTest(tst);
Console.WriteLine((int)tst[0]);
Console.WriteLine((int)tst[1]);
Console.WriteLine((int)tst[2]);
Console.WriteLine((int)tst[3]);
Console.WriteLine((int)tst[4]);
Console.WriteLine((int)tst[5]);
它输出零。我期望非零值,因为每个char的较低或较高部分在C ++中被更改(除非char数组不作为基本数组传递)
为什么C#不能像字节数组一样传递字符数组(我知道字符串在内存中是2字节,但这怎么能与“我无法在C ++中更改”的情况相关? )
将Visual Studio 2015 Community Edition与最新更新结合使用。双方都是为x64编译的。
还有一些奇怪的事情,例如Marshal.SizeOf(tst[0].GetType())
返回“1”而sizeof(char)
在C#(不安全的上下文)中返回“2”。
答案 0 :(得分:2)
您可以通过这种方式更改字符串到字节数组
byte[] bytes = Encoding.ASCII.GetBytes(somestring);
并将其传递给c ++函数