我需要在我创建的AppDomain联播的AssemblyResolve事件时,我给自己定DisallowApplicationBaseProbing =真。 我这样做的原因是为了强制运行时调用,而不是一次探测它需要解决的组装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 =真实的,它不知道在哪里可以找到该组件。 我好像鸡肉和蛋的问题。 它需要解决我的组装来装集解析器,但需要装配解析器来解决我的组装。
感谢您的任何和所有帮助。
-麦克风
随着大量的实验,我得到了以下工作:
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文件地狱。
文章来源: Need to hookup AssemblyResolve event when DisallowApplicationBaseProbing = true