我正在开发一个托管的C++应用程序,它将与另一家公司的产品进行交互。他们的产品基于.net,使用的主要API来自一个名为foo.dll的.net程序集。如果不在GAC中,如何从另一个应用程序的bin目录使用.net程序集?
我的应用程序需要先安装他们的产品。安装自己的产品yeilds三个不同的应用程序,每thier自己的目录,每个都有自己的/ bin目录,并各自具有相同的.dll文件的本地副本,所以你会发现:
C:\company\product1\bin\foo.dll
C:\company\product2\bin\foo.dll
C:\company\product3\bin\foo.dll
公司告诉我们哪些.dll要使用,以及哪些是他们在安装产品时未放入GAC的。目前,我可以通过在构建完成后将他们的.dlls复制到我的bin目录中来运行我的应用程序。但是,现在我正在为我的产品创建一个安装程序,但我很难找到处理此问题的优雅方法。假设他们的API不会改变,我应该可以在他们的产品的大多数版本上运行,只要这些.dll我匹配他们的产品在该机器上使用的那个。
显然,理想的解决方案是让他们在安装产品时将这些程序集放入GAC中,特别是因为他们自己共享这些程序集,但这不太可能发生,因为他们的产品还不成熟,许多更重要的问题,以及他们的工作对他们有用。
所以我留下了如何查找和使用安装我的产品时所需的.dll的问题。我拿出方案至今有以下几种:
包括它们的.dll在我安装
- 坏,因为这锁我自己的软件的特定的构建,我们无论如何,他们都会从他们那里获得增量开发版本,这与他们的公开发布不匹配。
我的安装程序是否找到他们的安装目录并运行gacutil.exe以及将.dlls放入GAC所需的任何其他内容。
- 糟糕,因为将Gacutil.exe只应该是发展,这意味着我们不得不把它列入我们的安装程序,并与我们自己的产品一起安装。它也可能干扰他们的产品找到组装。
让我的安装程序找到他们的安装目录,并将需要的.dll文件复制到我自己的目录中。
- 简单,它可以工作,但不雅观,并且意味着我的应用程序可能会中断,如果他们的产品甚至有一小部分更新,直到新的.dlls被复制完成。我也想避免需要复制文件。
使用,我发现在http://www.roelvanlisdonk.nl/?p=713代码在运行时的安装目录编程添加到我的应用程序的.NET搜索路径。
- Reasonab简单,如果它的工作,但更多的代码来维护。到目前为止,它似乎是从目录自动加载dll的唯一途径。
托管C++和.NET还是比较新的给我,我的大部分编码已经基于linux-C++。我的感觉是,这将会非常困难,因为如果其他公司不希望其他人能够针对他们开发,他们不能正确地管理他们如何使用他们的.net程序集。
有没有人有更多的经验不得不处理这样的事情,并找到了解决办法?
奇妙的问题! – 2013-03-12 23:21:04
你已经回答了你自己的问题。在安装时复制DLL是个不错的主意。在运行时从其他目录加载它是一个糟糕的想法。因为现在他们可以随时打破你的应用程序。不要这样做。 – 2013-03-12 23:24:22
他们的产品需要在您的产品之前进行安装,这是什么?我认为你最好的选择是发布你建立的DLL。如果需要将安装的产品与某种兼容性级别相匹配,则安装程序应检查* product *的兼容版本,而不是尝试共享实际的二进制文件,对其进行更改可能会破坏您的应用程序。 – shambulator 2013-03-12 23:36:04