我正在玩tlbimp,我找到/noclassmembers
选项,我就像:
Ahhah!我敢打赌,这将打破早期约束!
但是,令我非常懊恼的是,即使使用使用此选项生成的互操作程序集,一切似乎仍能正常工作。也就是说,在替换这个新的互操作程序集时,没有编译问题(或者我的测试机器上的明显的运行时问题)。
那么, {em>完全做/noclassmembers
做了什么,为什么 总是 选项吗
请考虑以下事项:
(从文件大小来看,Visual Studio自动生成的互操作程序集不使用此选项。)
感谢。
答案 0 :(得分:2)
COM使用基于接口的编程模型。 coclass本身不应该公开任何成员,它实现接口并使用IUnknown :: QueryInterface()公开它们。但是,类型库不会阻止coclass公开自己的成员。值得注意的是,[ComVisible]的托管类不会应用[ClassInterface(ClassInterfaceType.None)]属性。那些可见的实现细节可能是TypeLoadException的源。
因此,当您使用该选项时不会导致任何问题并不令人惊讶,行为良好的客户端代码将仅使用公开的接口。您可以使用oleview.exe SDK工具查看类型库并查看正在公开的内容。使用File + View Typelib并选择.tlb或.dll