1

我需要interop.dll从类型库中重新生成。因此我开火了

TlbImp.exe" foo.tlb /out:interop.dll

但与原来相比interop.dll,我发现对象浏览器(见下文)

void SetNodeArr(int Size, FOO_NODE[] pArray)       // original interop.dll

方法参数的开放数组SetNodeArr丢失:

void SetNodeArr(int Size, ref FOO_NODE pArray)     // regenrated interop.dll

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

Q我需要什么调整才能将参数pArray声明为开放数组而不是简单引用?

4

1 回答 1

2

这是一个很正常的事故。您可以通过从 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-passed-by-reference,这是最安全的选择。因此ref FOO_NODE。当您对 COM 服务器的实现方式感到困惑时,您也无能为力。

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

于 2015-06-09T17:25:26.377 回答