如何使C ++ / CLI DLL在不使用GAC的情况下解决对托管程序集(DLL)的依赖性?

问题描述 投票:1回答:1

我们目前将ODBC驱动程序构建为4个DLL:

  1. 实现ODBC(C)API的DLL,大多数是用C ++实现的,带有一些用C ++ / CLI编写的“胶水”代码,用于与#2,#3和#4进行交互

  2. 包含一个托管程序集(用C#编写)的DLL,它定义了用于#1和#4相互通信的'基本'接口。

  3. 另一个包含依赖于#2的托管程序集的DLL,并定义了#2中类的某些扩展名
  4. 但另一个包含托管程序集的DLL,其中包含'逻辑”,取决于#2&#3

要部署驱动程序,我们将DSN配置为指向#1,然后将#2,#3和#4放入GAC。

我们有一个客户希望完全避免使用GAC。我知道将#2,#3和#4与加载#1'works'的应用程序放在同一目录中,但这不是一个好的解决方案,因为许多不同的应用程序可能会使用该驱动程序。

我们如何进行设置,以便无需GAC即可解决依赖关系?我曾尝试创建清单文件(基于https://docs.microsoft.com/en-us/windows/win32/sbscs/assembly-manifests),但似乎不起作用(引发EEFileLoadException异常,因为它找不到托管程序集,这与我从中删除依赖项后发生的情况相同。 GAC)。我将清单文件和所有的.DLL放入同一个目录。

我通过一些(也许还不够)谷歌搜索,找不到这种情况下的任何好的文档/示例。

c++ .net manifest gac mixed-mode
1个回答
0
投票

我不确定我是否完全理解您的问题,但我会尽力回答:

在尝试解决此问题时,我们应记住以下几点:

  1. 直到您处于未解析类型的第一个外观所在的堆栈帧中,融合才起作用(并因此而导致依赖性解析)。
  2. 我们可以假定CLR已在主机进程中加载​​,并且我们至少有一个Appdomain。 (否则,您必须考虑这两种情况-尤其是被进程占用,默认情况下不会加载CLR。在这种情况下您想做什么?您自己加载CLR?隐式?显式?如果是,您如何配置您的Appdomain?您的应用程序根目录在哪里?您的探测路径是什么?

基于这两点,您可以订阅AppDomain.AssemblyResolve Event。但是,您应该以这种方式重构代码,因此融合不会在您成功订阅之前尝试解析程序集。在处理程序中,仅处理正在解析YOUR程序集的事件,然后从所需的任何位置(例如,从本机库所在的路径)加载它们。

© www.soinside.com 2019 - 2024. All rights reserved.