gpt4 book ai didi

c# - 当 DisallowApplicationBaseProbing = true 时需要连接 AssemblyResolve 事件

转载 作者:太空狗 更新时间:2023-10-30 01:07:54 25 4
gpt4 key购买 nike

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

当代码尝试执行时,新的应用程序域尝试解析我正在其中执行的程序集。因为 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 。

关于c# - 当 DisallowApplicationBaseProbing = true 时需要连接 AssemblyResolve 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11122052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com