.NET 中免注册 COM 互操作的具体步骤(调用复制的 COM dll,无需 regsvr32)

问题描述 投票:0回答:3

我想向我的 .NET 应用程序添加免注册 COM 引用。免注册意味着用户无需将 COM 组件注册到系统即可运行应用程序。

我找到了很多关于这个主题的文章(例如MSDN这个S/O问题等),但没有一个包含具体步骤。这是我尝试过但没有成功的方法:

  1. 使用 mt.exe 生成 COM dll 的清单(例如
    foo.dll
    ),如此答案中所述。
  2. foo.dll
    foo.dll.manifest
    添加到我的应用程序中,作为“构建操作”=“内容”和“复制到输出目录”=“始终复制”。
  3. 添加对
    interop.foo.dll
    附带的
    foo.dll
    的引用。
  4. 使用此部分添加应用程序清单文件:

    <dependency>
      <dependentAssembly>
        <assemblyIdentity type="win32" name="foo" />
      </dependentAssembly>
    </dependency>
    
  5. 构建并运行。

出现错误,提示应用程序配置不正确。在

<assemblyIdentity>
中尝试了不同的值,但没有运气。

有人可以分享经验吗?谢谢。

com-interop regfreecom
3个回答
6
投票

汉斯的回答有正确的信息,但当我第一次读到它时,我不清楚该怎么做。在尝试了很多不同的事情之后,我终于成功了,而且非常简单:

  1. 在开发者机器上注册COM类。
  2. 在应用程序项目中,添加 COM 引用。
  3. 在参考属性中,设置以下内容:
    • 孤立=真实
    • 复制本地 = True
    • Embed Interop Types = False(Hans 在评论中指出这是不必要的,但我尚未验证)

按照这些步骤,将自动生成

interop.foo.dll
和应用程序清单。这允许用户无需注册即可使用 COM 组件。

相反,如果你没有在开发机器上注册COM,你仍然可以通过添加对

interop.foo.dll
的引用来开发和构建应用程序(可以在注册了COM类的机器上生成,然后复制),但构建结果只能在注册了COM组件的机器上运行。可能有一个解决方案,但需要更深入地了解 MSBuild 如何与 COM 引用一起工作,我没有花时间研究这一点。

所以简而言之,运行时免注册COM的关键是在开发机器上注册COM类。


3
投票

您的清单不正确。 它应该包含

<file>
元素而不是
<dependentAssembly>
元素。 使用
<comClass>
元素来声明可创建的共同类。

生成清单是 VS 构建系统中的内置功能。 为了使其正常工作,需要在您的开发计算机上正确安装 COM 组件。 不要尝试无需注册的 COM 清单,除非您可以在计算机上没有清单的情况下使其正常工作,否则您将遇到“两个”问题,而不是一个。 因此,对于初学者来说,请确保使用供应商的安装程序或部署说明正确安装服务器。 并确保创建对象并调用方法的测试程序正确运行。 使用任何机器上都可用的已知良好的 COM 服务器来练习这一点很有用。 从控制台应用程序项目模板创建一个新项目。 项目 + 添加引用,浏览选项卡,选择 c:\windows\system32\shell32.dll。 选择添加的Shell32引用并将其Isolated属性更改为True。 构建+重建。

查看项目的 bin\Debug 构建目录,并使用记事本打开 app.exe.manifest 文件。 观察 file 和 comClass 元素,这也是您需要的。 如果这没有帮助,那么请联系 COM 服务器的所有者,他应该能够为您提供您需要的清单。


0
投票

通过将其放入项目文件中来启用 COM 托管:
  1. <PropertyGroup> <EnableComHosting>true</EnableComHosting> </PropertyGroup>
为您的 DLL 项目启用免注册 COM。这将在您编译时自动创建一个描述您的 COM 类型的 YourDll.X.manifest 文件(这是 YourDll.comhost.dll 的 .manifest)。
  1. <PropertyGroup> <EnableRegFreeCom>true</EnableRegFreeCom> </PropertyGroup>
对于您的 COM-dll:选择“项目”->“添加新文件”->“应用程序清单文件”并将其放入其中(这是从 YourDll.dll 到 YourDll.comhost.dll 的链接):
  1. <?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>
确保此清单已在 YourDll 项目文件中注册,如下所示:
  1. <PropertyGroup> <ApplicationManifest>YourDll.manifest</ApplicationManifest> </PropertyGroup>
对于使用 COM-dll 的应用程序,选择“项目”->“添加新项目...”->“应用程序清单文件”并使其如下所示:
  1. <?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 不是系统范围的东西。

© www.soinside.com 2019 - 2024. All rights reserved.