1

我正在玩tlbimp,我找到了这个/noclassmembers选项,我就像:

啊哈!我打赌这将打破早期绑定!

但是,令我懊恼的是,即使使用使用此选项生成的互操作程序集,一切似乎仍然正常。也就是说,在替换这个新的互操作程序集时,没有编译问题(或我的测试机器上明显的运行时问题)。

那么,究竟做了什么/noclassmembers,为什么希望总是使用这个选项呢?

考虑以下:

  1. 显然有时需要“避免 TypeLoadError 异常”,并且
  2. 生成的互操作程序集更小(在我的情况下它只有 3/4 大小)

(从文件大小来看,Visual Studio 自动生成的互操作程序集没有使用该选项。)

谢谢。

4

1 回答 1

2

COM 使用基于接口的编程模型。coclass 本身不应公开任何成员,它实现接口并使用 IUnknown::QueryInterface() 公开它们。然而,类型库不会阻止 coclass 公开其自己的成员。值得注意的是,托管类是 [ComVisible] 并且不应用 [ClassInterface(ClassInterfaceType.None)] 属性。这些可见的实现细节可能是 TypeLoadException 的来源。

所以当你使用该选项时它不会引起任何问题也就不足为奇了,表现良好的客户端代码只会使用暴露的接口。您可以使用 oleview.exe SDK 工具查看类型库并查看暴露的内容。使用 File + View Typelib 并选择 .tlb 或 .dll

于 2012-01-24T19:00:05.240 回答