首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义AppDomain和PrivateBinPath

自定义AppDomain和PrivateBinPath
EN

Stack Overflow用户
提问于 2011-07-08 15:21:56
回答 3查看 25.6K关注 0票数 10

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

代码语言:javascript
复制
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时,我一直得到文件未找到异常。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-12 00:20:52

我想我理解了为什么会发生这种情况,这是因为当前域也需要加载程序集,即使您将程序集加载到不同的应用程序域中,当前域也需要了解并加载它,这是因为.NET是如何设计的。

查一下这里的细节。

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

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

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

希望这能有所帮助。

票数 6
EN

Stack Overflow用户

发布于 2013-05-22 19:43:01

在尝试从bin目录之外的目录动态加载dll文件时,我遇到了这个线程。长话短说,我能够通过使用AppDomain.CurrentDomain.AssemblyResolve事件来完成这个任务。以下是代码:

代码语言:javascript
复制
//--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路径之外,等等)。我希望这能节省别人几个小时..。

票数 11
EN

Stack Overflow用户

发布于 2011-07-08 20:00:14

首先,确保插件是AppDomain基本路径的子目录。PrivateBinPath将只在here描述的子目录上工作。

如果这不是问题所在,那么看看您的融合绑定日志。使用fusion log viewer也有一个很好的Blog Post。融合日志将告诉您它在哪里搜索程序集。这应该会告诉您,您的路径是否包括在搜索中。

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6626647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档