包含字符串的编组结构我基本上想在c#中从用户那里获取int名称和字符串年龄,并将其发送到一个用c编写的dll方法,其中包含int和char[50]参数并返回字符串。我创建了以下场景,但我失败了,任何文本都有代码我有一个用c开发的dll,它有一个结构structArgument{intage;字符名称[50];};和方法extern"C"{__declspec(dllexport)ArgumentFillData(Argumentdata){Argumentmydata;mydata.age=data.age;for(inti=0;i<=sizeof(data);i++){mydata.name[i]=data.name[i];}返回我的数据;我在C#中的Cs_dll.cs[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]中声明它publicstructArgument{publicintage;[MarshalAs(UnmanagedType.TBStr)]//公共字符名称;公共字符[]名称;};publicclassCs_Dll{[DllImport("TestLib.dll")]publicstaticexternArgumentFillData(参数数据);}现在再按一个按钮,我想做privatevoidbutton1_Click(objectsender,EventArgse){Argumentdata=newArgument();data.age=Convert.ToInt32(textBox_age.Text);char[]name={'a','b','r','a','r','','a','h','m','e','d',''};对于(inti=0;i<=name.Length;i++){数据.名称[i]=名称[i];}//Array.Copy(name,data.name,name.Length);参数结果=Cs_Dll.FillData(data);textBox_get.Text=result.age.ToString();textBox_age.Text=result.name.ToString();但是我得到了一个错误你需要将Argument的结构定义更改为[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]publicstructArgument{publicintage;[MarshalAs(UnmanagedType.LPStr,SizeConst=50)]公共字符串名称;}[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]publicstructArgument{publicintage;[MarshalAs(UnmanagedType.LPStr,SizeConst=50)]公共字符串名称;}–或–[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]unsafepublicstructArgument{publicintage;固定字符名称[50];}[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]unsafepublicstructArgument{publicintage;固定字符名称[50];您可能还会发现这篇文章对字符串的默认封送处理很有帮助在结构中,要封送定义为char[]的char数组,您应该使用UnmanagedType.ByValTStr。以上就是《C#学习教程:包含字符串的编组结构》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)][MarshalAs(UnmanagedType.ByValTStr,SizeConst=50)]公共字符串名称;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
