自定义AppDomain和PrivateBinPath

本文关键字:PrivateBinPath AppDomain 自定义 | 更新日期: 2023-09-27 18:01:47

我使用c# 4.0和一个控制台应用程序只是为了测试,下面的代码确实给出了一个异常。

AppDomainSetup appSetup = new AppDomainSetup()
{
    ApplicationName = "PluginsDomain",
    ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
    PrivateBinPath = @"Plugins",
    ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
};
AppDomain appDomain = AppDomain.CreateDomain("PluginsDomain", null, appSetup);
AssemblyName assemblyName = AssemblyName.GetAssemblyName(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins", "sample.dll"));
Assembly assembly = appDomain.Load(assemblyName); //This gives an exception of File not found
AppDomain.Unload(appDomain);

在我创建的AppDomain上使用Load时,我一直得到文件未发现异常。

谢谢。

自定义AppDomain和PrivateBinPath

当我试图从bin目录外的目录动态加载dll文件时,我遇到了这个线程。长话短说,我能够通过使用AppDomain.CurrentDomain.AssemblyResolve事件来实现这一点。下面是代码:

//--begin example:
public MyClass(){
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    foreach (var moduleDir in _moduleDirectories)
    {
        var di = new DirectoryInfo(moduleDir);
        var module = di.GetFiles().FirstOrDefault(i => i.Name == args.Name+".dll");
        if (module != null)
        {
            return Assembly.LoadFrom(module.FullName);
        }
    }
    return null;
}
//---end example

每次调用AppDomain.CurrentDomain.Load("...")方法时都会调用CurrentDomain_AssemblyResolve方法。这个自定义事件处理程序使用您自己的自定义逻辑来定位程序集(这意味着您可以告诉它在任何地方查找,甚至在bin路径之外,等等)。

首先确保Plugins是AppDomain基路径的子目录。PrivateBinPath将只在下面描述的子目录上工作

如果这不是问题,那么看看你的融合绑定日志。使用融合日志查看器也有一个很好的博客文章。聚变日志会告诉你它在哪里搜索组件。它会告诉你你的路径是否包含在搜索中。

另一种可能性是,它正在找到您的程序集,但不是它的依赖项之一。同样,融合日志查看器将告诉您

我想我已经弄清楚了为什么会发生这种情况,那是因为当前域需要加载程序集,即使你在不同的应用程序域中加载程序集,当前域需要知道它并加载它,这是因为。net的设计方式。

查看详情。

http://msdn.microsoft.com/en-us/library/36az8x58.aspx

,当我检查融合日志时,我发现新创建的应用程序域能够成功地从私有bin路径加载程序集,为什么你仍然得到"File not found"的异常,因为这个异常最初属于当前的应用程序域。

这意味着如果您将程序集复制到当前应用程序路径或当前域正在探测的路径中,您将发现可以将程序集加载到自定义域中。

希望对你有帮助。