假设我们在 VS 2005 (VB .Net) 中有一个 .NET 项目。该项目使用非 GUI COM 对象。当我添加对该对象的引用时,VS 会创建互操作 dll。但是我在另一个项目中向 COM 对象添加了新方法。如何在不显式调用的情况下更新互操作 dll tlbimp
?我希望 Intellisense 显示此 COM 对象中的新方法列表。
问问题
2682 次
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 的交易......
但是,您可以尝试进一步自动化构建过程:
- 在您的服务器项目中,调用
tlbimp
构建后事件,并让它创建一个Primary Interop Assembly。 - 自动将 PIA 部署到GAC。
- 在您的客户端项目(.NET 项目)中,引用 PIA。
- 每次构建新的服务器项目时,刷新客户端项目中的 IntelliSense 缓存(“编辑”->“智能感知”->“刷新本地缓存”或Ctrl+ Shift+ R)。
希望这可以帮助!
于 2013-04-02T14:09:43.097 回答