当前位置: 首页 > 编程语言 > C#

如何使用非托管导出将结构数组从.NET传递到Delphi(RobertGiesecke)?

时间:2023-04-10 22:08:19 C#

如何使用非托管导出将结构数组从.NET传递到Delphi(RobertGiesecke)?我刚刚问了我的问题并得到了答案:“无法返回具有非托管导出的自定义类型的实例(RobertGiesecke)”->无法返回具有非托管导出的自定义类型的实例(RobertGiesecke)我想知道是否(以及如何传递一个使用非托管导出(RobertGiesecke)从.NET到Delphi的结构数组:[DllExport]publicstaticvoidCreateSampleInstance(outSample[]sample)]其他;}`我的问题是如何编写Delphi方面以及在.NET中设置哪些属性。非常感谢。数组比较棘手,因为您需要更多地注意数组的分配和销毁位置。最干净的方式总是分配在调用者,将数组传递给被调用者以填充数组。在您的上下文中,此方法将如下所示:publicstructSample{[MarshalAs(UnmanagedType.BStr)]publicstringName;}[DllExport]publicstaticintfunc([Out,MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1)]Sample[]samples,refintlen){//len保存输入数组的长度//len是assigned已赋值的项数//用返回值表示成功或失败for(inti=0;i需要指定数组需要向外编组。如果你想valuesmarshaledbothways,thenyouwoulduseIn,OutinsteadofOut.YoualsoneedtouseMarshalAsandUnmanagedType.LPArraytoIndicateshowtomarshaledthearray.你确实需要指定一个大小参数,以便编组器知道如何许多项目要编组回非托管代码。然后在Delphi端,您可以这样声明函数:typeTSample=recordName:WideString;结尾;PSample=^TSample;函数func(样本:PSample;varlen:整数):整数;标准调用;外部dll名称;:TSample数组;i,len:整数;....长度:=10;设置长度(样本,长度);如果func(PSample(samples),len)=0thenfori:=0tolen-1doWriteln(samples[i].Name);更新正如AlexS发现的(见下面的评论),只有.net4支持通过引用传递大小参数索引。在早期版本中,您需要按值传递大小参数索引。我选择通过引用传递它的原因是允许以下协议:调用者传入一个表示数组大小的值。被调用者传递一个值,指示已填充了多少元素。这在.net4上工作正常,但在早期版本中,您需要在步骤2中使用一个额外的参数。以上是C#学习教程:Howtopassanarrayofstructuresfrom.NETtoDelphiusingunmanagedexport(RobertGiesecke)?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: