• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

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在下,传参结果有问题:


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


...全文
179 点赞 收藏 4
写回复
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*这个类型
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2020-05-09 09:12
社区公告

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