我想在我的.NET应用程序中添加一个免注册的COM引用。免注册意味着用户无需在其系统中注册COM组件即可运行应用程序。
我发现了很多关于这个主题的文章(例如MSDN,this S/O question等),但没有一篇包含具体步骤。这是我尝试过但没有用的东西:
foo.dll
),如this answer中所述。foo.dll
和foo.dll.manifest
添加到我的应用中,作为“构建操作”=“内容”和“复制到输出目录”=“始终复制”。interop.foo.dll
附带的foo.dll
的引用。使用此部分添加应用清单文件:
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="foo" />
</dependentAssembly>
</dependency>
构建并运行。
说应用程序配置不正确时出错。在没有运气的情况下在<assemblyIdentity>
中尝试了不同的值。
有人可以分享经验吗?感谢。
答案 0 :(得分:4)
汉斯的回答有正确的信息,但我不清楚当我第一次看到它时该做什么。在尝试了许多不同的事情后,我终于开始工作了,这非常简单:
通过执行这些步骤,将自动生成interop.foo.dll
和应用清单。这允许用户无需注册即可使用COM组件。
相反,如果你没有在开发机器上注册COM,你仍然可以通过添加对interop.foo.dll
的引用来开发和构建应用程序(可以在注册了COM类的机器上生成)然后复制),但构建结果只能在注册了COM组件的机器上运行。可能有一个解决方案,但需要更深入的了解MSBuild如何使用COM引用,我没有花时间调查。
简而言之,运行时无注册COM的关键是在开发机器上注册COM类。
答案 1 :(得分:3)
你的清单不正确。它应包含<file>
元素而不是<dependentAssembly>
元素。使用<comClass>
元素声明可创建的共同类。
生成清单是VS构建系统中的内置功能。要使其工作,需要在开发机器上正确安装COM组件。不要尝试一个免注册的COM清单,除非你可以在你的机器上没有它的情况下使它工作,你将打击两个问题而不是一个。因此,对于初学者,请确保使用供应商的安装程序或部署说明正确安装服务器。并确保创建对象并调用方法的测试程序正常运行。
使用可在任何机器上使用的已知良好的COM服务器来执行此操作非常有用。从Console Application项目模板创建一个新项目。 Project + Add Reference,Browse选项卡,选择c:\ windows \ system32 \ shell32.dll。选择添加的Shell32引用并将其Isolated属性更改为True。构建+重建。
查看项目的bin \ Debug构建目录,并使用记事本打开app.exe.manifest文件。观察文件和comClass元素,这也是你所需要的。如果这没有帮助,那么转向COM服务器的所有者,他应该能够为您提供所需的清单。