【发布时间】: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 的问题。到目前为止,我提出的选项如下:
-
在我的安装程序中包含他们的 .dll
- 不好,因为这将我锁定在他们软件的特定版本中,而且我们仍然从他们那里获得增量开发版本,这与他们的公开版本不匹配。
-
让我的安装程序找到他们的安装目录并运行 gacutil.exe 以及将 .dll 放入 GAC 所需的任何其他内容。
- 不好,因为 gacutil.exe 应该只用于开发,这意味着我们必须将它包含在我们的安装程序中,并将它与我们自己的产品一起安装。它还可能会干扰他们的产品查找程序集。
-
让我的安装程序找到他们的安装目录并将我需要的 .dll 复制到我自己的目录中。
- 很简单,它可以工作,但不优雅,这意味着如果他们的产品在复制新的 .dll 之前对其进行了微小的更新,我的应用程序可能会崩溃。我还想避免复制文件的需要。
-
使用我在http://www.roelvanlisdonk.nl/?p=713 找到的代码,在运行时以编程方式将它们的安装目录添加到我的应用程序的 .net 搜索路径中。
- 原因很简单,如果它可以工作,但需要维护更多代码。到目前为止,这似乎是从其目录自动加载 dll 的唯一途径。
托管 C++ 和 .net 对我来说仍然相对较新,我的大部分编码都是基于 linux 的 C++。我的感觉是,这将非常困难,因为如果其他公司希望其他人能够针对他们进行开发,他们并没有正确管理他们如何使用他们的 .net 程序集。
有没有经验丰富的人不得不处理类似的事情并找到解决方法?
【问题讨论】:
-
您已经回答了自己的问题。在安装时复制 DLL 是个坏主意。在运行时从其他目录加载它是一个更糟糕的想法。因为现在他们可以随时破坏您的应用程序。不要这样做。
-
他们的产品有什么需要在您之前安装的?我认为您最好的选择是发布您构建的 DLL。如果需要将已安装的产品与某个级别的兼容性相匹配,那么您的安装程序应检查 产品 的兼容版本,而不是尝试共享实际的二进制文件,更改可能会破坏您的应用程序。
标签: .net dll assemblies gac managed