C# 调用 C++ DLL,参数为结构体

独行~背包客 2020-05-09 09:12:14
在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在下,传参结果正确:

num在上,path在下,传参结果有问题:


有那位大神可以帮忙解释下吗?是代码问题,还是有什么相关机制导致的?谢谢!


...全文
419 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
独行~背包客 2020-05-12
  • 打赏
  • 举报
回复
感谢诸位,本帖问题已经得到解决,但还有一个相当于进阶的问题,也是关于结构体传参的问题,在另外一个刚开的帖子中,请各位大神移步,帮忙看一下,谢谢! https://bbs.csdn.net/topics/396531722
wanghui0380 2020-05-12
  • 打赏
  • 举报
回复
对,问题没错。涉及到内存对齐,封送结构体,两边对齐方式要一样,不然就对不上了
独行~背包客 2020-05-12
  • 打赏
  • 举报
回复
引用 1 楼 sgyiliya 的回复:
你试下,在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)]//不要上面的"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了
sgyiliya 2020-05-09
  • 打赏
  • 举报
回复
你试下,在c#里面把数据转换为byte[],用byte[]类型的数据传递给c++里面的char*这个类型

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧