【问题标题】:pinvoke returning ascii char array to c#pinvoke将ascii char数组返回到c#
【发布时间】:2014-07-05 13:03:50
【问题描述】:

我正在用 c# 编写一个应用程序,它使用我使用 pinvoke 在 c 中编写的 dll。 这是dll的代码:

 __declspec(dllexport) char** foo()
    {
        int i;
        char arr[5]="omer";
        char **str_arr=(char**)malloc(sizeof(char*));
        str_arr[0]=(char*)malloc(sizeof(char)*5);
        strcpy(str_arr[0],arr);
        return str_arr;
    }

这是c#中的代码:

class Program
{

    [DllImport("gg.dll", CallingConvention = CallingConvention.Cdecl)]
    public static unsafe extern char** foo();
    static unsafe void Main(string[] args)
    {
      int  [] arr;
      int i;
    char [] char_arr={'o','m','e','r'};
      string[] string_arr=new string [1];
      char** str_arr;
        str_arr=foo();
        for (i = 0; i < 4; i++)
        {
           char_arr[i]=str_arr[0][i];
        }
        string_arr[0] = new string(st);
        free(*str_arr);
       free(str_arr);
    }
}

现在当指针返回时,第一个字符数组的内容是乱码(中文字符)而不是“omer”,这是为什么?

我认为这可能是因为 c# 中的 char 数组可能使用 unicode 编码,但是当我在调用函数 foo 之后更改它之前测试 char_arr 中内容的值时,它表示 ASCII 中的字母

【问题讨论】:

  • 相当基本的问题。 C# 中的 char 与 C 中的 char 不匹配。C# 版本占用 2 个字节,与 C 变体最接近的匹配是 byte。您的 free() 调用显然存在缺陷,您的 C 代码中有 两个 malloc() 调用,这需要两个 free() 调用才能匹配。他们使用相同内存分配器的几率很低。
  • 谢谢你,我检查了我的免费通话没有缺陷,我检查了 c# 中的指针与 c 中分配的地址相同
  • 这段代码全错了。这不是如何做到的。您是否希望我们帮助您展示如何以正确的方式进行操作,或者您是否已经设置公平?
  • @David Heffernan 我想让你告诉我正确的方式我真的想知道我做错了什么?并且代码可能很难看,这只是因为我写了一个小sn-p来尝试将字符串从c传输到c#。当我将代码集成到我的应用程序时,我的代码将更具可读性并且不使用良好的代码实践
  • 使用 SysAllocString 返回一个 BSTR

标签: c# c dll pinvoke dllimport


【解决方案1】:

您的 C 代码使用单字节字符,而您的 C# 代码需要 16 位双字节字符。

看看related question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2023-03-25
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多