我的目标是在两个给定文件夹之间进行缺失的依赖关系检查。
想象一下以下设置。
根目录\DirA\A.dll
根\DirB\B.dll
B 取决于 A。
因此,给定这些文件夹,我想创建一个新的 AppDomain,加载 B.dll 并在该新 AppDomain 中自动解析和隔离 DirA(A.dll) 的依赖项。
隔离是这里的关键,因为当我卸载这个 AppDomain 时,我想创建一个新的 AppDomain,并可能再次将 DirA 作为依赖项,但 DirC 库需要它,因此在 DirC 也依赖于 DirB 的情况下,我希望它抛出一个例外。
编辑:添加代码示例,以帮助更好地描述我的问题。
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = @"C:\Root";
setup.ApplicationName = "Isolated Domain"
setup.PrivateBinPath = @"DirA;DirB";
setup.PrivateBinPathProbe = "";//disable search in AppBase..
var domain = AppDomain.CreateDomain(Guid.NewGuid().ToString(),
AppDomain.CurrentDomain.Evidence,
setup,
AppDomain.CurrentDomain.PermissionSet);
//The following statement in theory should pick B.dll's dependency from DirA.
var assembly = domain.Load(AssemblyName.GetAssemblyName(@"C:\Root\DirB\B.dll").Name);
//Do the same in a different domain for C.dll
感谢您对此的任何帮助。
这看起来像是一份工作解决事件处理程序(更多详细信息MSDN 关于解决未知程序集)
所以,你可以写类似的东西
class MyResolver
{
public static Assembly MyResolveEventHandler( Object sender, ResolveEventArgs args )
{
// confirm args.Name contains A.dll
String dllName = args.Name.Split({','}, SplitStringOptions.None)[0];
if (dllName == "A")
{
return Assembly.LoadFile(@"C:\Root\DirA\A.dll")
}
return null;
}
}
在您创建的域中,您将执行以下操作:
domain.AssemblyResolve += new ResolveEventHandler(MyResolver.MyResolveEventHandler);
确保在 B 中引用 A 之前绑定事件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)