当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。