C# 当disallowApplicationBaseProbling=true时,需要连接AssemblyResolve事件

C# 当disallowApplicationBaseProbling=true时,需要连接AssemblyResolve事件,c#,assembly-resolution,C#,Assembly Resolution,当我设置disallowApplicationBaseProbling=true时,我需要在我创建的AppDomain上连接AssemblyResolve事件。我这样做的原因是强制运行时调用解析程序集所需的AssemblyResolve事件,而不是首先进行探测。这样,另一个开发人员就不能只将MyDllName.dll粘贴在ApplicationBase目录中,并覆盖我想在AssemblyResolve事件中加载的程序集 这样做的问题如下 class Program { static v

当我设置disallowApplicationBaseProbling=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行

当代码尝试执行时,新的应用程序域将尝试解析我正在其中执行的程序集。因为disallowApplicationBaseProbling=true,它不知道在哪里可以找到此程序集。我似乎有鸡和蛋的问题。它需要解析我的程序集才能连接程序集解析程序,但需要程序集解析程序来解析我的程序集

谢谢你的帮助


-迈克

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

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地狱。

你看到
Console.WriteLine(“Hello”)的输出了吗?如果是,也许您应该实现一个能够解析程序集的逻辑。我无意中问了这个问题,因为我也有同样的问题。如果我找到了解决方案,我会发布一个答案。