将Interop DLL放入GAC?

5
这可能是一个有点愚蠢的问题,但我需要一些澄清。我对.NET还比较新,在创建一个需要引用现有COM DLL的EXE时,Visual Studio 2010自动创建了一个“Interop”DLL,它需要/用于与遗留COM DLL一起工作。
我已经部署了我的项目,并将这个Interop DLL包含在其中(在同一个文件夹中),一切都正常工作。然而,我有其他应用程序需要使用相同的遗留COM DLL。是否可以在每个应用程序中以相同的方式引用它,并继续使用每个应用程序的“Interop”DLL进行部署?不幸的是,所有这些小应用程序都放在同一个文件夹中,并且每个应用程序都使用相同的Interop DLL(因此如果另一个应用程序使用它,则它已经存在)。我被迫将它们放在同一个文件夹中,因为这些应用程序被调用作为定制父应用程序的一种方式。因此,当它想要运行“自定义”应用程序时,它只会查找本地文件夹。我只是担心如果其中一个EXE被删除并且他们取出Interop DLL,那么仍然依赖它的其他应用程序将失败。
所以,我想知道是否可以将Interop DLL放入GAC中,这样做是否可行或者是否是一个好主意?我已经安装了Interop DLL到GAC中,然后从我的EXE运行的文件夹中删除了Interop DLL,但它无法工作。我得到一个错误消息:“无法加载文件或程序集”。我被卡在让这个工作上。
以下是我的问题:
  1. 我是否需要以不同的方式引用我的项目中的Interop DLL,使其现在来自GAC? 还是
  2. 是否需要向我的.NET代码添加类似于Assembly.Load的内容才能使其工作?
  3. 是否需要使用TLBIMP自己创建Interop DLL?
非常感谢您的帮助!
最好的问候,
纳尔逊
2个回答

1

这被称为PIA,“主要交互程序集”。您可以通过Tlbimp.exe的/primary选项生成它们,HowTo 在此处

在某些情况下,您必须拥有PIA,当您的某个程序集将导入库中的类型公开给使用单独加载了互操作库副本的另一个程序集时需要。 显然这不是你的情况。 它也正在逐渐淘汰,VS2010支持“嵌入式互操作类型”功能,这是一项非常理想的功能,重要库完全消失。

在您的情况下,我不会费心。 将其放入GAC没有任何优势,只会带来麻烦。 否则,不知道您遇到了什么问题,请使用Fuslogvw.exe来解决程序集解析问题。


0
你可以使用 ILmerge 将多个 .dll 文件合并成一个,并将其部署到 GAC 中。
顺便提一下,如果你在使用 VS.NET 2010,你可以使用 Embed Interop types 这个项目属性,看这里

谢谢Stefan。我之前不熟悉ILmerge这个工具,它确实是一个有趣的应用程序。然而,我并不想将主EXE与Interop DLL合并后再放到GAC中,因为该EXE只在一个地方使用。更多的是,Interop DLL被多个EXE共享,并且使用GAC的目的就是为了它。 - Nelson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接