自定义 AppDomain 和 PrivateBinPath

2024-02-03

我使用 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);

使用时我不断收到文件未找到异常Load在我创建的 AppDomain 上。

Thanks.


当我尝试从 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

方法CurrentDomain_AssemblyResolve每次调用AppDomain.CurrentDomain.Load("...")方法被调用。此自定义事件处理程序使用您自己的自定义逻辑来完成定位程序集的工作(这意味着您可以告诉它在任何地方查找,甚至在 bin 路径之外等)。我希望这可以节省其他人几个小时......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 AppDomain 和 PrivateBinPath 的相关文章

随机推荐