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

标签 .net com msbuild

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

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

这可行,但不幸的是,DLL 需要在构建机器上注册,这意味着(除其他外)在同一构建机器上构建使用不同版本 DLL 的项目的多个版本很不方便。

MSDN 显示 ResolveComReference看起来它做正确的事情的任务,但我的 google-search-fu 还不够好,无法提供其使用的实际示例。有可能做我想做的事吗?我在正确的轨道上吗?

最佳答案

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

  • 使用 tlbimp.exe 为 COM DLL 创建您自己的互操作程序集.见 MSDN用于命令行参数。
  • 在 .NET 项目而不是 COM DLL 中引用您的互操作程序集。

  • 完成此操作后,您不再需要在构建 .NET 解决方案时在计算机上注册 COM DLL,只需要您的互操作程序集。

    互操作程序集可以永久保存在文件夹中,直到 (a) COM DLL 破坏二进制兼容性,或 (b) .NET 代码实际使用的 COM 接口(interface)发生更改。

    如果您有所有二进制兼容的不同版本的 COM DLL,则针对包含 .NET 代码所需接口(interface)的最早版本编译互操作程序集。然后,您不必为不同版本更新互操作程序集。

    此外,如果您可以假设 COM DLL 已安装在目标计算机上,则无需在安装程序中包含 COM DLL。

    关于.net - 是否可以通过路径而不是 GUID 在托管项目中引用 COM DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1106309/

    相关文章:

    c# - 从数据库中填充函数字典

    .net - SharpSSH jsch 算法协商失败

    C#模拟音量静音按下

    c# - 通过 Visual Studio 2008 运行测试时如何修改 Web.config 中的连接字符串?

    msbuild - 如何在MSBuild中包括排除的文件类型

    c# - 获取 double[,] 矩形数组的 double[] 行数组

    c# - 64 位平台上的 COM

    c# - 为什么从 C# 4.0 开始使用的 COM 库需要大量使用动态类型?

    c# - 在 VS 2015 扩展中,如何在解决方案资源管理器中获取选定的对象?

    .net - 将非托管 DLL 部署到输出目录