在C#中调用C++ dll中函数接口,传一个结构体过去,结构体中char*的位置,会导致传参的结果发生变化,不知道为什么

在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了

对,问题没错。涉及到内存对齐,封送结构体,两边对齐方式要一样,不然就对不上了

 

你可能感兴趣的:(在C#中调用C++ dll中函数接口,传一个结构体过去,结构体中char*的位置,会导致传参的结果发生变化,不知道为什么)