Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用来自其他应用程序的.net程序集';s bin目录,如果它是';他不在GAC吗? 我正在开发一个管理C++应用程序,它将与另一个公司的产品进行接口。他们的产品基于.net,使用的主要API来自一个名为foo.dll的.net程序集_.net_Dll_Assemblies_Gac_Managed - Fatal编程技术网

如何使用来自其他应用程序的.net程序集';s bin目录,如果它是';他不在GAC吗? 我正在开发一个管理C++应用程序,它将与另一个公司的产品进行接口。他们的产品基于.net,使用的主要API来自一个名为foo.dll的.net程序集

如何使用来自其他应用程序的.net程序集';s bin目录,如果它是';他不在GAC吗? 我正在开发一个管理C++应用程序,它将与另一个公司的产品进行接口。他们的产品基于.net,使用的主要API来自一个名为foo.dll的.net程序集,.net,dll,assemblies,gac,managed,.net,Dll,Assemblies,Gac,Managed,我的应用程序要求首先安装他们的产品。安装他们的产品会产生三个不同的应用程序,每个应用程序都位于自己的目录中,每个应用程序都有自己的/bin目录,每个应用程序都有相同.dll文件的本地副本,因此您可以找到: C:\company\product1\bin\foo.dll C:\company\product2\bin\foo.dll C:\company\product3\bin\foo.dll 该公司告诉我们应该使用哪些.dll,以及在您安装其产品时,哪些尚未放入GAC。目前,我可

我的应用程序要求首先安装他们的产品。安装他们的产品会产生三个不同的应用程序,每个应用程序都位于自己的目录中,每个应用程序都有自己的/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之前对其进行了一次小的更新。我还想避免复制文件的需要
  • 使用我在中找到的代码,在运行时以编程方式将它们的安装目录添加到我的应用程序的.net搜索路径中

    • 如果可行的话,理由很简单,但是需要维护更多的代码。到目前为止,它似乎是从DLL目录自动加载DLL的唯一途径
  • 托管C++和.NET对我来说还是比较新的,我的大部分代码都是基于Linux的C++。我的感觉是,这将是非常困难的,因为另一家公司没有正确地管理他们如何使用他们的.net程序集,如果他们希望其他人能够开发他们的.net程序集


    有没有经验丰富的人必须处理类似的问题并找到解决方法?

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

    这里的主要问题是,所讨论的组件是否打算从其他AP使用?他们的API会稳定吗?如果没有,基本上你无能为力


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

    你已经回答了你自己的问题。在安装时复制DLL是个坏主意。在运行时从其他目录加载它是一个更糟糕的主意。因为现在他们可以随时破坏你的应用程序。不要这样做。他们的产品有什么要求在你的产品之前安装的?我认为你最好的选择是运送你所建立的DLL。如果需要在一定的兼容性级别内匹配已安装的产品,则安装程序应检查产品的兼容版本,而不是尝试共享实际的二进制文件,对其所做的更改可能会破坏您的应用程序。这些程序集供其他应用程序使用,但我们是第一个在他们公司之外这样做的,所以我们遇到了大多数初期问题。我们与他们有很多沟通,这就是为什么我知道他们不可能在短期内对此采取任何行动的原因。多亏了你的建议,我搜索了一下,发现了这个博客:看起来象征性链接可能是我们最好的短期答案。我会做一些测试,如果有效的话,把这个标记为答案。直到现在我才知道Windows中有一个符号链接,我以为它只是unix。请注意,从Windows XP到Vista,符号链接功能已经升级/更改。Windows 7是我们需要支持的唯一操作系统。