首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当DisallowApplicationBaseProbing = true时需要挂接AssemblyResolve事件

当DisallowApplicationBaseProbing = true时需要挂接AssemblyResolve事件
EN

Stack Overflow用户
提问于 2012-06-20 22:43:07
回答 1查看 2.4K关注 0票数 4

当我设置了AssemblyResolve = true时,我需要在我创建的AppDomain上连接一个DisallowApplicationBaseProbing事件。我这样做的原因是强制运行时调用解析程序集所需的AssemblyResolve事件,而不是先探测。这样,其他开发人员就不能只将MyDllName.dll放在ApplicationBase目录中,并覆盖我想要在AssemblyResolve事件中加载的程序集。

这样做的问题如下...

代码语言:javascript
复制
  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,所以它不知道在哪里可以找到这个程序集。我似乎有个鸡生蛋的问题。它需要解析我的程序集以连接程序集解析器,但需要程序集解析器来解析我的程序集。

感谢大家的帮助。

-Mike

EN

回答 1

Stack Overflow用户

发布于 2013-10-31 17:22:25

通过大量的实验,我得到了以下结果:

代码语言:javascript
复制
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
  }
}

域的创建方式如下:

代码语言:javascript
复制
    AppDomainSetup setupInfo = AppDomain.CurrentDomain.SetupInformation;
    setupInfo.DisallowApplicationBaseProbing = true;

    domain = AppDomain.CreateDomain("Domain name. ", null, setupInfo);
    AssemblyResolver.Register(domain);

抱歉,我无法共享解析和加载程序集的代码。首先,它还不能工作。其次,在这种情况下,它将太多和太具体,无法与普通公众分享。

我将引导一个对象结构,该对象结构与反序列化所需的程序集一起从单个文件中序列化。为此,我真的值得直接去.dll地狱。

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

https://stackoverflow.com/questions/11122052

复制
相关文章

相似问题

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