2013-03-12 61 views
2

我正在开发一个托管的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的问题。我拿出方案至今有以下几种:

  1. 包括它们的.dll在我安装

    • 坏,因为这锁我自己的软件的特定的构建,我们无论如何,他们都会从他们那里获得增量开发版本,这与他们的公开发布不匹配。
  2. 我的安装程序是否找到他们的安装目录并运行gacutil.exe以及将.dlls放入GAC所需的任何其他内容。

    • 糟糕,因为将Gacutil.exe只应该是发展,这意味着我们不得不把它列入我们的安装程序,并与我们自己的产品一起安装。它也可能干扰他们的产品找到组装。
  3. 让我的安装程序找到他们的安装目录,并将需要的.dll文件复制到我自己的目录中。

    • 简单,它可以工作,但不雅观,并且意味着我的应用程序可能会中断,如果他们的产品甚至有一小部分更新,直到新的.dlls被复制完成。我也想避免需要复制文件。
  4. 使用,我发现在http://www.roelvanlisdonk.nl/?p=713代码在运行时的安装目录编程添加到我的应用程序的.NET搜索路径。

    • Reasonab简单,如果它的工作,但更多的代码来维护。到目前为止,它似乎是从目录自动加载dll的唯一途径。

托管C++和.NET还是比较新的给我,我的大部分编码已经基于linux-C++。我的感觉是,这将会非常困难,因为如果其他公司不希望其他人能够针对他们开发,他们不能正确地管理他们如何使用他们的.net程序集。

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

+0

奇妙的问题! – 2013-03-12 23:21:04

+1

你已经回答了你自己的问题。在安装时复制DLL是个不错的主意。在运行时从其他目录加载它是一个糟糕的想法。因为现在他们可以随时打破你的应用程序。不要这样做。 – 2013-03-12 23:24:22

+0

他们的产品需要在您的产品之前进行安装,这是什么?我认为你最好的选择是发布你建立的DLL。如果需要将安装的产品与某种兼容性级别相匹配,则安装程序应检查* product *的兼容版本,而不是尝试共享实际的二进制文件,对其进行更改可能会破坏您的应用程序。 – shambulator 2013-03-12 23:36:04

回答

1

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

这里的主要问题是,如果有问题的程序集是从其他aps使用的?他们的API会稳定吗?如果没有,基本上没有什么可以做的。

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

+0

这些程序集是为其他应用程序使用而设计的,但我们是第一个在他们公司之外这样做的程序,所以我们正在解决大部分的问题。我们与他们有很多沟通,这就是为什么我知道他们很快就不会对此做任何事情。 – Ninjammer 2013-03-12 23:38:42

+0

感谢您的建议,我做了一个搜索,并遇到了这个博客:http://blogs.microsoft.co.il/blogs/ohad/archive/2011/01/10/how-to-overcome-the-clr -fusion-limitation.aspx 它看起来象征性的链接可能是我们最好的短期回答。我会做一些测试,并将其标记为答案,如果它有效。 直到现在我还不知道Windows中有一个符号链接等价物,我以为它只是unix。 – Ninjammer 2013-03-12 23:51:08

+0

请注意,从Windows XP到Vista的符号链接功能已升级/更改。 – 2013-03-12 23:55:50

相关问题