我不确定这是否能准确回答您的问题,但我们有一个类似的设置,其中我们有一个独立的子 AppDomain 和一个共享 DLL 文件夹,我们在不使用 AssemblyResolve 的情况下取得了成功。
我们的文件结构是:
[PathToApplication]\OurApplication.exe
[PathToApplication]\AddIns\[SharedAssemblies]\*.dll
[PathToApplication]\AddIns\[FirstAddIn]\*.dll
[PathToApplication]\AddIns\[SecondAddIn]\*.dll
方括号中的部分被实际路径替换。
在我们的例子中,共享程序集也由主 AppDomain 加载,因此我们在主 AppDomain 中进行App.config
如下设置。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="AddIns\[SharedAssemblies]" />
</assemblyBinding>
</runtime>
确保共享程序集不存在于主可执行文件旁边,否则它将从那里加载它们,并且会默默地停止在所有 AppDomain 之间共享内存中的 DLL。
然后,对于每个加载项的 AppDomain,我们对其进行了配置,因此基本路径是加载项文件夹和共享文件夹上方的文件夹,并设置了私有 bin 路径,以便它以正确的顺序搜索正确的子文件夹:
var basePath = @"[PathToApplication]\AddIns";
var configFile = Path.Combine(
basePath,
addInFolder,
addInAssemblyName + ".dll.config");
var binPaths = new [] { "[SharedAssemblyFolder]", addInFolder };
setup = new AppDomainSetup
{
ApplicationBase = basePath,
ConfigurationFile = configFile,
LoaderOptimization = LoaderOptimization.MultiDomain,
PrivateBinPath = string.Join(";", binPaths),
PrivateBinPathProbe = string.Empty,
};
这样,它总是首先搜索共享文件夹,因此即使加载项提供了自己的同名 DLL,它也会被忽略。
我们[System.LoaderOptimization(LoaderOptimization.MultiDomain)]
在应用程序入口点上使用 set 运行它,并验证了 DLL 实际上是在内存中共享的(很容易出错并默默地阻止这种情况发生)。
希望这在某种程度上有所帮助。