将C#char数组传递给C ++与字节数组不同

时间:2017-05-26 12:03:20

标签: c# c++ arrays

在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”。

1 个答案:

答案 0 :(得分:2)

您可以通过这种方式更改字符串到字节数组

byte[] bytes = Encoding.ASCII.GetBytes(somestring);

并将其传递给c ++函数