在C#中调用C++ dll中函数接口,传一个结构体过去,结构体中char*的位置,会导致传参的结果发生变化,不知道为什么
C#端:
[DllImport("Dll_Test.dll", EntryPoint = "Interface_Sub", CallingConvention = CallingConvention.Cdecl)]
public extern static int Interface_Sub(ref Sub sub);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct Sub
{
public IntPtr path;
public int num;
};
private void FuncSub()
{
var sub = new Sub();
sub.path = Marshal.StringToHGlobalAnsi("TestSub");
sub.num = 5;
var rst = Interface_Sub(ref sub);
}
C++端:
struct Sub
{
char* path;
int num;
};
extern "C" __declspec(dllexport) int Interface_Sub(Sub* sub);
int Interface_Sub(Sub* sub)
{
return 5;
}
其他位置一模一样,只是调整结构体中path和num的位置,就会导致sub结果不一样
path在上,num在下,传参结果正确:
有那位大神可以帮忙解释下吗?是代码问题,还是有什么相关机制导致的?
你试下,在c#里面把数据转换为byte[],用byte[]类型的数据传递给c++里面的char*这个类型
1.一般的数据类型可以转byte[],但是自定义的数据结构类型如何转,而且是比较复杂的嵌套型的结构类型?
2.针对上面遇到的问题,已经解决了如下,在定义结构体是改下属性设置,不要设置pack
public extern static int Interface_Sub(ref Sub sub);
//[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]//不要上面的www.9iBee.com"Pack = 1"
public struct Sub
{
public IntPtr path;
public int num;
};
private void FuncSub()
{
var sub = new Sub();
sub.path = Marshal.StringToHGlobalAnsi("TestSub");
sub.num = 5;
var rst = Interface_Sub(ref sub);
}
这样就ok了
对,问题没错。涉及到内存对齐,封送结构体,两边对齐方式要一样,不然就对不上了