2012-06-01 43 views
3

我想向我的.NET应用程序添加免注册COM参考。免注册意味着用户可以在不将COM组件注册到他们的系统的情况下运行该应用程序。.NET中无注册COM互操作的具体步骤(调用无regsvr32复制COM DLL)

我发现了很多关于此主题的文章(例如MSDNthis S/O question等),但没有包含具体步骤。这是我曾尝试和没有工作:

  1. 生成清单的COM DLL(比如foo.dll)使用mt.exe在this answer描述。
  2. foo.dllfoo.dll.manifest作为“Build Action”=“Content”和“Copy to Output Directory”=“始终复制”添加到我的应用程序中。
  3. 添加对interop.foo.dll的引用,其随附foo.dll
  4. 添加应用程序清单文件与本节:

    <dependency> 
        <dependentAssembly> 
        <assemblyIdentity type="win32" name="foo" /> 
        </dependentAssembly> 
    </dependency> 
    
  5. 编译和运行。

有错误提示应用程序配置不正确。在<assemblyIdentity>尝试不同的值,但没有运气。

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

回答

3

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

  1. 在开发人员计算机上注册COM类。
  2. 在应用程序项目中,添加COM引用。
  3. 在引用属性,设置这些:
    • 隔离=真
    • 复制本地=真
    • 嵌入互操作类型=假(汉斯指出,在评论认为这是不必要的,但我没有验证)

通过遵循这些步骤,interop.foo.dll和应用清单自动生成。这允许用户在不注册的情况下使用COM组件。相反,如果您没有在开发机器上注册COM,您仍然可以通过添加对interop.foo.dll的引用来开发和构建应用程序(它可以在注册了COM类的计算机上生成,然后复制周围),但构建结果只能在注册了COM组件的机器上运行。这可能有一个解决方案,但需要更深入地了解MSBuild如何与COM引用一起工作,而我没有花时间研究。

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

+0

难道你不是说你想要做*没有注册? – Arafangion

+2

@Arafangion我希望用户使用没有COM注册的应用程序。该解决方案需要在开发机器上注册,这是可以接受的。 –

+0

哇!我希望几年前我找到了这个答案。我一直在遵循的所有其他指南都需要更多的手动操作! –

2

您的清单不正确。它应该包含<file>元素而不是<dependentAssembly>元素。用<comClass>元素声明可创建的联合类。

生成清单是VS构建系统中的一个内置功能。为了使它工作,COM组件需要在您的开发机器上正确安装。不要尝试免注册的COM清单,除非你的机器上没有一个清单,否则你会打两个问题而不是一个问题。因此,对于初学者,请确保使用供应商的安装程序或部署说明正确安装服务器。并确保创建对象并调用方法的测试程序正常运行。

使用任何机器上可用的已知良好的COM服务器进行此练习很有用。从控制台应用程序项目模板创建一个新项目。项目+添加引用,浏览选项卡,选择c:\ windows \ system32 \ shell32.dll。选择添加的Shell32引用并将其Isolated属性更改为True。 Build +重建。

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