我想向我的 .NET 应用程序添加免注册 COM 引用。免注册意味着用户无需将 COM 组件注册到系统即可运行应用程序。
我找到了很多关于这个主题的文章(例如MSDN,这个S/O问题等),但没有一个包含具体步骤。这是我尝试过但没有成功的方法:
foo.dll
),如此答案中所述。foo.dll
和 foo.dll.manifest
添加到我的应用程序中,作为“构建操作”=“内容”和“复制到输出目录”=“始终复制”。interop.foo.dll
附带的 foo.dll
的引用。使用此部分添加应用程序清单文件:
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="foo" />
</dependentAssembly>
</dependency>
构建并运行。
出现错误,提示应用程序配置不正确。在
<assemblyIdentity>
中尝试了不同的值,但没有运气。
有人可以分享经验吗?谢谢。
汉斯的回答有正确的信息,但当我第一次读到它时,我不清楚该怎么做。在尝试了很多不同的事情之后,我终于成功了,而且非常简单:
按照这些步骤,将自动生成
interop.foo.dll
和应用程序清单。这允许用户无需注册即可使用 COM 组件。
相反,如果你没有在开发机器上注册COM,你仍然可以通过添加对
interop.foo.dll
的引用来开发和构建应用程序(可以在注册了COM类的机器上生成,然后复制),但构建结果只能在注册了COM组件的机器上运行。可能有一个解决方案,但需要更深入地了解 MSBuild 如何与 COM 引用一起工作,我没有花时间研究这一点。
所以简而言之,运行时免注册COM的关键是在开发机器上注册COM类。
您的清单不正确。 它应该包含
<file>
元素而不是 <dependentAssembly>
元素。 使用 <comClass>
元素来声明可创建的共同类。
生成清单是 VS 构建系统中的内置功能。 为了使其正常工作,需要在您的开发计算机上正确安装 COM 组件。 不要尝试无需注册的 COM 清单,除非您可以在计算机上没有清单的情况下使其正常工作,否则您将遇到“两个”问题,而不是一个。 因此,对于初学者来说,请确保使用供应商的安装程序或部署说明正确安装服务器。 并确保创建对象并调用方法的测试程序正确运行。 使用任何机器上都可用的已知良好的 COM 服务器来练习这一点很有用。 从控制台应用程序项目模板创建一个新项目。 项目 + 添加引用,浏览选项卡,选择 c:\windows\system32\shell32.dll。 选择添加的Shell32引用并将其Isolated属性更改为True。 构建+重建。
查看项目的 bin\Debug 构建目录,并使用记事本打开 app.exe.manifest 文件。 观察 file 和 comClass 元素,这也是您需要的。 如果这没有帮助,那么请联系 COM 服务器的所有者,他应该能够为您提供您需要的清单。
通过将其放入项目文件中来启用 COM 托管:
<PropertyGroup>
<EnableComHosting>true</EnableComHosting>
</PropertyGroup>
<PropertyGroup>
<EnableRegFreeCom>true</EnableRegFreeCom>
</PropertyGroup>
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="YourDll"/>
<dependency>
<dependentAssembly>
<!-- RegFree COM - CoreCLR Shim -->
<assemblyIdentity
type="win32"
name="YourDll.X"
version="1.0.0.0" />
</dependentAssembly>
</dependency>
</assembly>
<PropertyGroup>
<ApplicationManifest>YourDll.manifest</ApplicationManifest>
</PropertyGroup>
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="Laila.Shell.SampleApp"/>
<dependency>
<dependentAssembly>
<assemblyIdentity
name="YourDll"
version="1.0.0.0" />
</dependentAssembly>
</dependency>
</assembly>
虽然您不需要在注册表中注册 COM-dll,但您需要为每个将使用 COM dll 的应用程序创建从应用程序 .exe 到 COMDLL.comhost.dll 的清单跟踪。 Regfree COM 不是系统范围的东西。