使用type-lib中的tlbimp.exe重新生成interop.dll时,打开数组声明丢失

时间:2015-06-09 16:27:56

标签: c# com tlbimp

我需要从类型库重新生成<script src="https://cdnjs.cloudflare.com/ajax/libs/kineticjs/5.2.0/kinetic.min.js"></script> <div id="wrapper"> <div id="container"></div> </div>。因此我开火了

interop.dll

但与原版TlbImp.exe" foo.tlb /out:interop.dll 相反,我发现了对象浏览器(见下文)

interop.dll

void SetNodeArr(int Size, FOO_NODE[] pArray) // original interop.dll 的method-parameter的open数组丢失了:

SetNodeArr

我已经尝试了TlbImp.exe的一些选项,但没有运气。

我需要做什么调整才能将参数void SetNodeArr(int Size, ref FOO_NODE pArray) // regenrated interop.dll 声明为开放数组而不是简单引用?

1 个答案:

答案 0 :(得分:1)

这是一个非常正常的事故。您可以通过Visual Studio命令提示符运行OleView.exe来查看基本问题。使用File + View Typelib并选择.tlb。你应该看到类似的东西:

   void SetNodeArr(int Size, FOO_NODE* pArray); 

指针是问题,它是模棱两可的。这可能意味着参数是一个数组,或者它可能意味着它是一个通过引用传递的结构。

对于设计用于C或C ++程序的COM服务器,您会看到类似这样的声明。当数组作为参数传递时,数组衰变为指向第一个元素的指针的语言。

这不能用于将数组视为对象的语言,例如.NET语言。支持许多不同类型语言的友好COM服务器会将此参数声明为SAFEARRAY。现在明确的是参数的类型是什么,它总是一个数组。不需要 Size 参数,安全数组知道自己的大小。这是一个对象。

因此,Tlbimp.exe没有机会猜测正确的翻译,它总是支持struct-pass-by-reference,这是最安全的选择。因此ref FOO_NODE。当你坚持使用COM服务器的方式时,你无法做任何事情来使它更明智。

可以修复互操作库,该过程在MSDN library中描述。使用ildasm.exe反编译程序集,编辑IL以修复声明(首先使用示例C#代码尝试查看它应该是什么样子),然后使用ilasm.exe将humpty-dumpty重新组合在一起