.net 是否可以通过路径而不是GUID引用托管项目中的COM DLL?

.net 是否可以通过路径而不是GUID引用托管项目中的COM DLL?,.net,com,msbuild,.net,Com,Msbuild,我有一个引用COM DLL的托管(实际上是asp.net)项目。现在,.csproj中的引用如下所示: <COMReference Include="thenameinquestion"> <Guid>{someguidhere}</Guid> <VersionMajor>1</VersionMajor> <VersionMinor>0</VersionMinor> <Lcid>0&l

我有一个引用COM DLL的托管(实际上是asp.net)项目。现在,.csproj中的引用如下所示:

<COMReference Include="thenameinquestion">
  <Guid>{someguidhere}</Guid>
  <VersionMajor>1</VersionMajor>
  <VersionMinor>0</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>tlbimp</WrapperTool>
</COMReference>

{someguidhere}
1.
0
0
tlbimp
这是可行的,但不幸的是,DLL需要在生成机器上注册,这意味着(除其他外)在同一生成机器上生成使用不同版本DLL的多个项目版本很不方便


MSDN显示的任务看起来是正确的,但我的谷歌搜索引擎还没有足够好,无法给出它的实际使用示例。有可能做我想做的吗?我走对了吗?

本文介绍了如何实现COM组件的免注册激活。也许它会有帮助:

正如您已经指出的,您正在寻找。关于这一点,已经有很多问题,寻找“手边的标签”和密切相关的标签

然而,您很容易就会看到,这可能是一个棘手的领域,尤其是:

  • Windows XP上似乎存在影响此功能的错误,有关详细信息,请参阅。不过,热修复程序已经可用,只要您只针对受控环境(例如构建计算机),这可能就足够了
  • 由于您的目标是ASP.NET,您应该知道,与桌面应用程序相比,这意味着您无法控制托管过程,托管过程可能因部署平台而异。这意味着要提供所需的应用程序清单来控制主机内COM组件的运行时绑定和激活并不容易(请参阅下一点了解可能的替代方案)
  • ASP.NET 2.0似乎通过删除非托管组件的并排功能使事情变得更加复杂。我还没有找到这方面的官方消息来源,但这本书的作者似乎是知情的;他至少提供了一个解决方案,虽然看起来很复杂,但可能很脆弱
总结这一点,我想强调的是,“免注册COM互操作”非常有用,可以大大简化许多场景。然而,对于您的特定场景和环境(托管ASP.NET),它可能不会使事情变得更容易,甚至根本不可能


祝你好运,请告诉我们你是否成功

看起来这是不可能的-Visual Studio将只查看参考中提到的GUID,而不关心其中暗示的路径


我们的日常构建服务器也有类似的问题——除非注册了COM服务器,否则COM客户端将无法编译。我们刚刚将注册/注销添加到构建序列中-它注册(regsv32)组件,然后从命令行运行VS,并在VS完成后立即注销组件(regsvr32-u)。运行平稳。

引用COM DLL时,Visual Studio会自动为其生成互操作程序集。我发现手动控制这个过程是将COM和.NET构建解耦的好方法

  • 使用
    tlbimp.exe
    为COM DLL创建自己的互操作程序集。有关命令行参数,请参见
  • 在.NET项目中引用互操作程序集,而不是在COM DLL中引用
  • 完成此操作后,在生成.NET解决方案时,不再需要在计算机上注册COM DLL,只需要您的互操作程序集

    在(a)COM DLL破坏二进制兼容性,或(b)对.NET代码实际使用的COM接口进行更改之前,互操作程序集可以一直保存在文件夹中

    如果COM DLL的不同版本都是二进制兼容的,则根据包含.NET代码所需接口的最早版本编译互操作程序集。这样就不必为不同版本更新互操作程序集

    此外,如果您能够假定COM DLL已经安装在目标计算机上,则不需要在安装程序中包含COM DLL