gpt4 book ai didi

c# - AppDomain.CurrentDomain.AssemblyResolve 可能存在的信任问题或我应该注意的其他问题

转载 作者:行者123 更新时间:2023-11-30 19:49:01 28 4
gpt4 key购买 nike

我目前正在使用以下代码:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
var name = args.Name + ".dll";
using (var input = Assembly.GetExecutingAssembly()
.GetManifestResourceStream(name)) {
Assembly dll = input != null
? Assembly.Load(input.ToArray())
: null;

return dll;
}
};

在本地的所有情况下,它似乎工作得很好,但是一个客户端在加载包含的 dll 时遇到问题(他们没有源代码访问权限)。

在使用这种类型的动态 dll 加载时,是否存在我应该注意的任何信任问题或陷阱?

Medium Trust 问题似乎不是问题,但是我们生成的 dll 无论如何都需要 Full Trust。我想这可能归结为安全权限之类的。

更新

在查看文档后,我再次注意到我之前跳过的一行,我认为它与我的问题有关。

“从 .NET Framework 4 开始,将为所有程序集引发 ResolveEventHandler 事件,包括资源程序集。在早期版本中,不会为资源程序集引发事件。如果操作系统是本地化后,处理程序可能会被调用多次:为回退链中的每个区域性调用一次。”

而在 3.5 中则不是。我会在确认后发布更新。

最佳答案

嗯,没有任何细节很难诊断;但是,我建议对上面的代码进行一些更改:

  1. args.Name 实际上是一个完整的程序集名称,而不仅仅是一个简单的名称,还可以包含版本等。将此值传递给 AssemblyName 的构造函数只会解析简单的名称。我怀疑这是您遇到的问题。

  2. 您应该在加载程序集位时传播当前域证据。这可能是您在现场看到的问题,但也可能不是。

  3. 不要使用执行程序集,而是通过对该程序集中包含的类型的显式引用来访问包含资源的正确程序集。只需替换下面示例中的“THIS_CLASS”。这是我对您遇到的问题的根本原因的最佳猜测。

  4. 您应该继续将此方法的结果缓存到全局字典中。为什么?可以调用您多次加载同一个程序集,并且每次调用您都必须返回程序集的相同实例。您的示例一次又一次地加载程序集。

  5. 添加详细的日志记录,记录您正在寻找的程序集、您尝试加载的资源名称、您从中加载资源的程序集、流是否为空、Load() 方法的结果等。

    static Dictionary<String, Assembly> _assemblies = new Dictionary<String, Assembly>(StringComparer.OrdinalIgnoreCase);
    AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
    {
    Assembly dll;
    var name = new AssemblyName(args.Name).Name + ".dll";
    if(!_assemblies.TryGetValue(name, out dll))
    {
    Assembly res = typeof(THIS_CLASS).Assembly;
    using (var input = res.GetManifestResourceStream(name))
    {
    if (input == null)
    {
    LogWrite("Assembly {0} does not contain {1}", res, name);
    return null;
    }
    if (null == (dll = Assembly.Load(input.ToArray(), AppDomain.CurrentDomain.Evidence)))
    {
    LogWrite("Assembly {0} failed to load.", name);
    return null;
    }
    LogWrite("Loaded assembly {0}.", name);
    _assemblies[name] = dll;
    return dll;
    }
    }
    return dll;
    };

关于c# - AppDomain.CurrentDomain.AssemblyResolve 可能存在的信任问题或我应该注意的其他问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4588125/

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