pinvoke将ascii字符数组返回到c#
我正在用c编写一个应用程序,它使用我用pinvoke用c编写的dll。 以下是dll的代码:pinvoke将ascii字符数组返回到c#,c#,c,dll,pinvoke,dllimport,C#,C,Dll,Pinvoke,Dllimport,我正在用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
__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#中的代码:
类程序
{
[DllImport(“gg.dll”,CallingConvention=CallingConvention.Cdecl)]
公共静态不安全外部字符**foo();
静态不安全void Main(字符串[]args)
{
int[]arr;
int i;
char[]char_arr={'o','m','e','r'};
string[]string_arr=新字符串[1];
字符**str_arr;
str_arr=foo();
对于(i=0;i<4;i++)
{
char_arr[i]=str_arr[0][i];
}
字符串_arr[0]=新字符串(st);
免费(*str_arr);
免费(str_arr);
}
}
现在当指针返回时,第一个字符数组的内容是乱七八糟的(中文字符),而不是“omer”,这是为什么
我想这可能是因为c#中的char数组可能使用unicode编码,但当我在调用函数foo后更改char#arr中的内容值之前,测试了它的值,它表示ASCII中的字母,您的
C
代码使用单字节字符,而C
代码需要16位双字节字符
看看一个非常基本的问题。C#中的字符与C中的字符不匹配。C#版本需要2个字节,与C变体最接近的匹配是字节。您的free()调用显然有缺陷,您的C代码中有两个malloc()调用,这需要两个free()调用来匹配。他们使用相同内存分配器的几率很低。谢谢你,我检查我的免费呼叫是否有缺陷。我检查,c中的指针与c中分配的地址相同。这段代码完全错误。这不是怎么做的。大卫·赫弗南:我想让你告诉我正确的方法,我真想知道我做错了什么?代码可能很难看,只是因为它只是我写的一个小片段,尝试将字符串从c传输到c。当我将代码集成到我的应用程序时,我的代码将更具可读性,并且不使用良好的代码实践。使用SysAllocString返回BSTR
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);
}
}