2

谷歌没有像我想要的那样帮助我,所以我在这里写帖子。我在 C# 和 C 函数(在 dll 中)中有 Unicode 字符串,它们需要 char(ANSI)*。我试着做

string tmp = "ala ma kota";
unsafe
{
    fixed (byte* data = &tmp.ToCharArray()[0])
    {
        some_function(data);
    }
}

但我无法在没有编码的情况下直接转换。我尝试使用 Encode 类但没有任何效果。我知道, some_function 需要用 char 指针调用。它指向字节数组的位置。

4

2 回答 2

6

您不需要自己明确地执行此操作。

相反,使用 P/Invoke 声明 C 方法以接受类型参数string

然后添加到 P/Invoke 声明中:

 [DllImport("YourDllName.dll", CharSet=CharSet.Ansi)]

然后,编组器将为您将字符串转换为 ANSI。

请注意,我假设字符串被传递给被调用函数,因此参数不是用于从被调用函数返回新字符串的指针。

有关更多详细信息,请参见此处:http: //msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.charset.aspx

事实上,默认情况下CharSet.Ansi,您可能只需将参数声明为,string而不是byte*(或您刚才使用的任何内容)。

于 2013-08-19T12:02:50.057 回答
3

您应该使用System.Text命名空间:

string tmp = "ala ma kota";
unsafe
{
    fixed (byte* data = &System.Text.Encoding.ASCII.GetBytes(tmp)[0])
    {
        some_function(data);
    }
}
于 2013-08-19T12:02:56.487 回答