4

假设我们在 VS 2005 (VB .Net) 中有一个 .NET 项目。该项目使用非 GUI COM 对象。当我添加对该对象的引用时,VS 会创建互操作 dll。但是我在另一个项目中向 COM 对象添加了新方法。如何在不显式调用的情况下更新互操作 dll tlbimp?我希望 Intellisense 显示此 COM 对象中的新方法列表。

4

1 回答 1

1

如果我对您的理解正确,您将拥有一个 COM 服务器(显然是进程内 / DLL),它承载您正在更新的对象。当您尚未编译 COM 服务器时,您希望这些更新可以通过客户端项目中的 IntelliSense 获得,对吧?

如果是这样:这是不可能的。让我描述一下原因:

IntelliSense 仅为项目的引用构建文档缓存。引用 COM 服务器与引用 .NET 项目不同。对于 .NET 项目,它能够直接从代码模型构建文档缓存。但是 COM 服务器通常是用一种语言描述的,编译器不知道!tlbimp生成一个为您调用 COM 服务器的 .NET 包装器。IntelliSense 能够理解包装器(互操作 DLL,它只不过是一个自动生成的 .NET DLL),但不能理解它的实际作用。所以你总是需要保持包装器是最新的。

每当您对 COM 服务器进行更改时,您都需要注册它(使用regsvr32),这样更改对客户端“可见”(在本例中为tlbimp)。然后,您必须重新添加对 .NET 项目的引用,这会导致tlbimp生成 IntelliSense 可以理解的新互操作 DLL。这就是 .NET 环境下与 COM 的交易......

但是,您可以尝试进一步自动化构建过程:

  1. 在您的服务器项目中,调用tlbimp构建后事件,并让它创建一个Primary Interop Assembly
  2. 自动将 PIA 部署到GAC
  3. 在您的客户端项目(.NET 项目)中,引用 PIA。
  4. 每次构建新的服务器项目时,刷新客户端项目中的 IntelliSense 缓存(“编辑”->“智能感知”->“刷新本地缓存”或Ctrl+ Shift+ R)。

希望这可以帮助!

于 2013-04-02T14:09:43.097 回答