【问题标题】:How can I use a .net assembly from another application's bin directory if it's not in the GAC?如果另一个应用程序的 bin 目录中的 .net 程序集不在 GAC 中,我该如何使用它?
【发布时间】:2013-02-28 17:17:39
【问题描述】:

我正在开发一个托管 C++ 应用程序,它将与另一家公司的产品交互。他们的产品是基于 .net 的,使用的主要 API 来自一个 .net 程序集,称为 foo.dll。

我的应用程序需要先安装他们的产品。安装他们的产品会产生三个不同的应用程序,每个都在自己的目录中,每个都有自己的 /bin 目录,每个都有相同 .dll 文件的本地副本,因此您可以找到:

C:\company\product1\bin\foo.dll  
C:\company\product2\bin\foo.dll  
C:\company\product3\bin\foo.dll  

当您安装他们的产品时,该公司告诉我们要使用哪些 .dll,哪些没有放入 GAC。目前,我可以通过在构建后将它们的 .dll 复制到我的 bin 目录中来运行我的应用程序。不过,现在我正在为我的产品创建一个安装程序,但我很难找到一种优雅的方式来处理这个问题。假设他们的 API 没有改变,我应该能够针对他们产品的大多数版本运行,只要我拥有的 .dll 与他们的产品在该机器上使用的那个相匹配。

显然,理想的解决方案是让他们在您安装他们的产品时将这些程序集放在 GAC 中,特别是因为他们自己共享这些程序集,但这不太可能发生,因为他们的产品仍然不成熟,有很多更重要的问题,以及他们所做的事情对他们有用。

所以我留下了如何查找和使用安装产品时所需的 .dll 的问题。到目前为止,我提出的选项如下:

  1. 在我的安装程序中包含他们的 .dll

    • 不好,因为这将我锁定在他们软件的特定版本中,而且我们仍然从他们那里获得增量开发版本,这与他们的公开版本不匹配。
  2. 让我的安装程序找到他们的安装目录并运行 gacutil.exe 以及将 .dll 放入 GAC 所需的任何其他内容。

    • 不好,因为 gacutil.exe 应该只用于开发,这意味着我们必须将它包含在我们的安装程序中,并将它与我们自己的产品一起安装。它还可能会干扰他们的产品查找程序集。
  3. 让我的安装程序找到他们的安装目录并将我需要的 .dll 复制到我自己的目录中。

    • 很简单,它可以工作,但不优雅,这意味着如果他们的产品在复制新的 .dll 之前对其进行了微小的更新,我的应用程序可能会崩溃。我还想避免复制文件的需要。
  4. 使用我在http://www.roelvanlisdonk.nl/?p=713 找到的代码,在运行时以编程方式将它们的安装目录添加到我的应用程序的 .net 搜索路径中。

    • 原因很简单,如果它可以工作,但需要维护更多代码。到目前为止,这似乎是从其目录自动加载 dll 的唯一途径。

托管 C++ 和 .net 对我来说仍然相对较新,我的大部分编码都是基于 linux 的 C++。我的感觉是,这将非常困难,因为如果其他公司希望其他人能够针对他们进行开发,他们并没有正确管理他们如何使用他们的 .net 程序集。

有没有经验丰富的人不得不处理类似的事情并找到解决方法?

【问题讨论】:

  • 您已经回答了自己的问题。在安装时复制 DLL 是个坏主意。在运行时从其他目录加载它是一个更糟糕的想法。因为现在他们可以随时破坏您的应用程序。不要这样做。
  • 他们的产品有什么需要在您之前安装的?我认为您最好的选择是发布您构建的 DLL。如果需要将已安装的产品与某个级别的兼容性相匹配,那么您的安装程序应检查 产品 的兼容版本,而不是尝试共享实际的二进制文件,更改可能会破坏您的应用程序。

标签: .net dll assemblies gac managed


【解决方案1】:

也许您可以通过对有问题的 .dll 建立符号链接来解决这个问题?这样,您的应用程序将能够查看和使用这些文件,并且您正在使用它们在磁盘上的物理文件。如果他们更新了文件(纠正了一些错误)但仍然向后兼容,您将能够自动使用他们的新代码/.dll。

这里的主要问题是,如果有问题的程序集是要从其他应用程序使用的?他们的 API 会稳定吗?如果没有,基本上你无能为力。

此外,如果您将它们的目录添加到程序集搜索加载路径中,您可能会无意加载错误的程序集,因为将来可能会有多个名为 X.dll 的程序集。

【讨论】:

  • 这些程序集是供其他应用程序使用的,但我们是第一个在他们公司之外这样做的,所以我们正在解决大部分初期问题。我们与他们进行了很多沟通,这就是为什么我知道他们短期内不太可能对此采取任何行动。
  • 感谢您的建议,我进行了搜索,发现了这个博客:blogs.microsoft.co.il/blogs/ohad/archive/2011/01/10/… 看起来符号链接可能是我们最好的短期答案。我会做一些测试,如果可行,将其标记为答案。直到现在我才知道 Windows 中有一个等效的符号链接,我以为它只是 unix。
  • 请注意,从 Windows XP 到 Vista 的符号链接功能已升级/更改。
  • Windows 7 是我们唯一需要支持的操作系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2018-05-22
  • 2012-12-06
相关资源
最近更新 更多