2

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

我的应用程序需要先安装他们的产品。安装他们的产品会产生三个不同的应用程序,每个应用程序都在自己的目录中,每个都有自己的 /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 程序集。

有没有更多经验的人不得不处理这样的事情并找到解决方法?

4

1 回答 1

1

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

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

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

于 2013-03-12T23:24:06.760 回答