gpt4 book ai didi

c# - SWIG:C++ 到 C#,指针到指针编码

转载 作者:太空狗 更新时间:2023-10-29 21:30:35 26 4
gpt4 key购买 nike

我有一些遗留代码要移植到 C#。我不能修改 C++ 代码,我只能凑合使用我得到的东西。

所以,情况。我正在使用 SwIG,我遇到了这个功能:

void MarshalMe(int iNum, FooClass** ioFooClassArray);

如果我对此运行 SWIG,它将不知道如何处理该数组,因此它将创建一个 SWIGTYPE_p_pFooClass。很公平!C# 代码看起来像

void MarshalMe(int iNum, SWIGTYPE_p_p_FooClass ioFooClassArray); // Not ideal!

有一些技术可以正确编码这种代码,所以我尝试了其中的一些:

%typemap(ctype)   FooClass** "FooClass**"
%typemap(cstype) FooClass** "FooClass[]"
%typemap(imtype, inattributes="[In, Out, MarshalAs(UnmanagedType.LPArray)]") FooClass** "FooClass[]"
%typemap(csin) FooClass** "$csinput"
%typemap(in) FooClass** "$1 = $input;"
%typemap(freearg) FooClass** ""
%typemap(argout) FooClass** ""

这有效地创建了一个更好的签名:

void MarshalMe(int iNum, FooClass[] ioFooClassArray); // Looks good! Would it work?

但是,当我尝试运行它时,出现以下错误:

{"Exception of type 'System.ExecutionEngineException' was thrown."}

关于实际类型图有什么想法吗?

最佳答案

异常告诉您该函数损坏了垃圾收集堆。它写到数组的末尾。如果它实际上是一个 FooClass[],这是个大问题,那么您必须先创建数组:

 FooClass[] array = new FooClass[666];
MarshalMe(42, array);

假设函数将用 FooClass 对象填充数组。数组的大小确实在这里很重要,您必须知道您将返回多少元素。只有当“iNum”是一个说明数组长度的参数时,它才能可靠地工作。传递 array.Length。

这也可能意味着该函数将自己创建数组并返回指向它的指针。如果是这样的话,你真的完蛋了,你不能释放数组的内存。

关于c# - SWIG:C++ 到 C#,指针到指针编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2479764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com