【问题标题】:Visual Studio - Can't reference tlb / dll anymoreVisual Studio - 不能再引用 tlb / dll
【发布时间】:2017-10-16 14:08:45
【问题描述】:

我正在编写一个通过 COM 接口与另一个程序通信的 C# 应用程序。到目前为止,ervything 运行良好。

在我删除 vs 引用对话框中的 .tlb 并通过 reglibv12.exe 取消注册后,我无法再添加它。

错误提示:

无法添加对 tlb 路径 的引用。请确保文件 是可访问的,那就是它是一个有效的程序集或 COM 组件。

这个问题不会出现在使用默认设置的同事电脑上。

到目前为止我尝试了什么: - 重新安装 Vs - 删除 Vs 用户文件夹 - 使用 reglibv12.exe 再次注册 tlb - 以管理员身份运行 Vs - 将 tlb 放入 Vs 项目文件夹 - 使用 Gacutil.exe \l 列出程序集 -> 我的 tlb 未列出的地方

【问题讨论】:

    标签: visual-studio tlb


    【解决方案1】:

    Regtlibv12.exe 是一个危险的工具。它经常在网页中被提及,程序员发现它可以为许可证限制提供一种解决方法。供应商倾向于提供两种不同的安装程序,一种为组件安装运行时支持,并且是免费的,可用于将产品安装在用户的机器上。另一个只有在您支付许可费时才能获得,用于在开发机器上编写使用该组件的代码。区别在于前者不注册类型库而后者注册。不想支付费用,或者只有一个许可证但被多个开发人员使用,或者有一个尖头发的老板认为一个应该对每个人都足够好并且软件永远不会改变,往往会让程序员寻找替代品。

    使用它注销一个类型库在实践中从来没有做任何有用的事情。它只是破坏了一个注册表项,它不会卸载任何东西。销毁注册表项是一种通常只会产生两个新问题的解决方案。也让组件供应商很难为您提供帮助,他们只是不希望您使用这样的生硬工具。最好的办法是使用供应商提供的安装程序并重新安装组件。您通常必须先卸载才能使所有内容恢复原状。

    在 C# 程序中使用类型库有三种不同的方式:

    • 项目 > 添加参考 > COM 选项卡 > 勾选列表中的条目。这是最好的方式,也提供了最好的保证,保证你的程序能够正确使用组件,并且能够跟上组件的变化。唯一真正的问题是,如果您只知道类型库文件名,选择哪个条目并不总是非常明显。如有必要,您可以反编译类型库并找到描述,运行 OleView.exe > File > View Typelib。

    • 项目 > 添加引用 > 浏览按钮 > 选择 .tlb 文件或嵌入了类型库的可执行文件。您现在正在尝试做的事情。仅当组件未在机器上注册或您有意构建程序以针对组件的旧版本时才需要。这是一种脆弱的方式,很容易使您使用的类型库与实际安装的组件不匹配。不幸的是,错误报告很糟糕,如果类型库转换不是完美的,那么它会产生“它不起作用”的错误消息。你正在看的那个。

    • 从开发人员命令提示符运行 Tlbimp.exe。这会预先生成互操作库,而不是前两个项目符号在构建时生成。这是诊断类型库问题的最佳方法,类型库会导致第二个项目符号失败。或者在构建服务器上可能有用。如果类型库包含无法直接转换的条目,您将看到警告。这是很常见的,不一定是致命的。如果您这样做,那么您通常需要项目目录中的互操作库并签入源代码管理。使用浏览按钮添加参考。请记住,当供应商组件发生更改时,您将不得不重新执行此操作。

    关注第一个项目符号。我应该注意到拥有一个 .tlb 文件是相当不寻常的。在绝大多数情况下,组件作者会将类型库嵌入到 DLL 中。一个原因可能是该组件实际上是用 .NET 语言开发的,使用 [ComVisible] 属性很容易做到这一点。类型库转换器对此非常不高兴,坚持要改为添加对 .NET 程序集的普通引用。

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      相关资源
      最近更新 更多