C#调用C++的dll,C#中的类型为string[],C++中的类型为char**,怎样把C#中的string[]传到C++中的char**?
C#:[DllImport("CalIsolatedSpan.dll",CallingConvention=CallingConvention.Cdecl)]public...
C#:
[DllImport("CalIsolatedSpan.dll", CallingConvention = CallingConvention.Cdecl)]
public extern static void CalIsolatedSpan(string isoSpan, string guideWire, string splitNumber, string[] arrMetDetail, int nCount, out string result);
C++:
extern "C"
{
__declspec(dllexport)
void CalIsolatedSpan(char* guideWire , char* splitNumber , char* isoSpan , char* metDetail[] , int nCount , char*& result);
};
代码应该怎么调整 展开
[DllImport("CalIsolatedSpan.dll", CallingConvention = CallingConvention.Cdecl)]
public extern static void CalIsolatedSpan(string isoSpan, string guideWire, string splitNumber, string[] arrMetDetail, int nCount, out string result);
C++:
extern "C"
{
__declspec(dllexport)
void CalIsolatedSpan(char* guideWire , char* splitNumber , char* isoSpan , char* metDetail[] , int nCount , char*& result);
};
代码应该怎么调整 展开
3个回答
展开全部
1、你的参数顺序两边没有对应
2、char*应该在DllImport里面加上CharSet=CharSet.ANSI
3、最后输出我不确定你这样行不行,我觉得应该是 out IntPtr result,然后之后再用其他办法从IntPtr转到Byte[]再转到string(IntPtr能不能直接到string我不确定)
4、char* []这种类型,C#中新建一个IntPtr[]然后分别把每个字符串搞成IntPtr再传过去可行。有没有更简便的方法不知道。string可以先到Byte[]然后再申请一块内存IntPtr然后从Byte[]拷过去。
5、C#中从string转到byte[]的时候,最后是不带结尾的0的,这个要注意自己加上去不然C++那边要Crash
6、你那个result是怎么申请内存的,然后最后打算怎么在C#里释放啊……囧
2、char*应该在DllImport里面加上CharSet=CharSet.ANSI
3、最后输出我不确定你这样行不行,我觉得应该是 out IntPtr result,然后之后再用其他办法从IntPtr转到Byte[]再转到string(IntPtr能不能直接到string我不确定)
4、char* []这种类型,C#中新建一个IntPtr[]然后分别把每个字符串搞成IntPtr再传过去可行。有没有更简便的方法不知道。string可以先到Byte[]然后再申请一块内存IntPtr然后从Byte[]拷过去。
5、C#中从string转到byte[]的时候,最后是不带结尾的0的,这个要注意自己加上去不然C++那边要Crash
6、你那个result是怎么申请内存的,然后最后打算怎么在C#里释放啊……囧
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询