当 DisallowApplicationBaseProbing = true 时需要连接 AssemblyResolve 事件
Posted
技术标签:
【中文标题】当 DisallowApplicationBaseProbing = true 时需要连接 AssemblyResolve 事件【英文标题】:Need to hookup AssemblyResolve event when DisallowApplicationBaseProbing = true 【发布时间】:2012-06-20 14:43:07 【问题描述】:当我设置 DisallowApplicationBaseProbing = true 时,我需要在我创建的 AppDomain 上连接一个 AssemblyResolve 事件。我这样做的原因是强制运行时调用它需要解析程序集的 AssemblyResolve 事件,而不是先进行探测。这样一来,其他开发人员就不能只将 MyDllName.dll 粘贴在 ApplicationBase 目录中并覆盖我想在 AssemblyResolve 事件中加载的程序集。
这样做的问题如下......
class Program
static void Main()
AppDomainSetup ads = new AppDomainSetup();
ads.DisallowApplicationBaseProbing = true;
AppDomain appDomain = AppDomain.CreateDomain("SomeDomain", null, ads);
appDomain.AssemblyResolve += OnAssemblyResolve;
appDomain.DoCallBack(target);
static System.Reflection.Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
Console.WriteLine("Hello");
return null;
private static void target()
Console.WriteLine(AppDomain.CurrentDomain);
代码永远不会超过 += OnAssemblyResolve 行。
当代码尝试执行时,新的应用程序域会尝试解析我正在执行的程序集。因为 DisallowApplicationBaseProbing = true,它不知道在哪里可以找到该程序集。我似乎有鸡和蛋的问题。它需要解析我的程序集以连接程序集解析器,但需要程序集解析器来解析我的程序集。
感谢所有帮助。
-迈克
【问题讨论】:
你看到Console.WriteLine("Hello");
的输出了吗?如果是,也许您应该实现一个能够解析程序集的逻辑。我偶然发现了这个问题,因为我有同样的问题。如果我找到解决方案,我会发布答案。
【参考方案1】:
通过大量实验,我得到了以下工作:
internal class AssemblyResolver : MarshalByRefObject
static internal void Register(AppDomain domain)
AssemblyResolver resolver =
domain.CreateInstanceFromAndUnwrap(
Assembly.GetExecutingAssembly().Location,
typeof(AssemblyResolver).FullName) as AssemblyResolver;
resolver.RegisterDomain(domain);
private void RegisterDomain(AppDomain domain)
domain.AssemblyResolve += ResolveAssembly;
domain.AssemblyLoad += LoadAssembly;
private Assembly ResolveAssembly(object sender, ResolveEventArgs args)
// implement assembly resolving here
return null;
private void LoadAssembly(object sender, AssemblyLoadEventArgs args)
// implement assembly loading here
域是这样创建的:
AppDomainSetup setupInfo = AppDomain.CurrentDomain.SetupInformation;
setupInfo.DisallowApplicationBaseProbing = true;
domain = AppDomain.CreateDomain("Domain name. ", null, setupInfo);
AssemblyResolver.Register(domain);
抱歉,我无法共享用于解析和加载程序集的代码。首先,它还不起作用。其次,在这种情况下与公众分享会过于具体。
我将引导一个对象结构,该结构与从单个文件反序列化所需的程序集一起序列化。为此,我真的应该直接进入 .dll 地狱。
【讨论】:
以上是关于当 DisallowApplicationBaseProbing = true 时需要连接 AssemblyResolve 事件的主要内容,如果未能解决你的问题,请参考以下文章