我需要从类型库重新生成<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
声明为开放数组而不是简单引用?
答案 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重新组合在一起