当DisallowApplicationBaseProbing = true时,需要连接AssemblyResolve事件

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

当代码尝试执行时,新的app域尝试解析我正在执行的程序集。因为DisallowApplicationBaseProbing = 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 hell。