visual-studio - Visual Studio - 无法再引用 tlb/dll

标签 visual-studio tlb

我正在编写一个 C# 应用程序,它通过 COM 接口(interface)与另一个程序进行通信。到目前为止,一切都进展顺利。

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

错误提示:

Reference to tlb path could not be added. Please make sure the file is accessible and that is it a valid assembly or COM component.

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

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

最佳答案

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

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

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

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

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

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

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

关于visual-studio - Visual Studio - 无法再引用 tlb/dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44019317/

相关文章:

azure - 在禁用公共(public)访问的情况下压缩部署 Azure 函数(存在访问限制)

memory - 地址间隔标识符 (ASID) 的用途

C# Dll - 导出函数

c - x86 上的简单 PAPI 分析中意外出现大量 TLB 未命中

c - 虚拟内存系统、页表和TLB

intel - intel的TLB结构

wpf - Visual Studio 2010 - XAML 编辑器非常慢

c++ - Windows C++ GUI 应用程序

c++ - LNK4075 : ignoring '/EDITANDCONTINUE' due to '/OPT:ICF' specification