首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AppDomain.AssemblyResolve事件

使用AppDomain.AssemblyResolve事件
EN

Stack Overflow用户
提问于 2012-02-08 01:12:08
回答 2查看 30.7K关注 0票数 12

在解析运行时加载的一些动态链接库(SerializationException for dynamically loaded Type)的程序集时,我尝试使用AppDomain.AssemblyResolve事件来处理异常。

当事件被激发时,我加载目录中的所有Assembly并创建一个all数组,然后使用此方法获取包含我指定的类型的all:

代码语言:javascript
复制
public static Assembly GetAssemblyContainingType(String completeTypeName, 
                                                 Assembly[] assemblies)
{
    Assembly assembly = null;

    foreach (Assembly currentassembly in assemblies)
    {
        Type t = currentassembly.GetType(completeTypeName, false, true);
        if (t != null)
        {
            assembly = currentassembly;
            break;
        }
    }

    return assembly;
}

问题是,此代码仅适用于AssemblyQualifiedName,而事件提供的ResolveEventArgs.Name没有那么有用。

你能给我一些建议吗?

有没有办法在事件被触发时将一些其他参数传递给它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-08 01:25:58

您可以从目录中定义程序集的字典,如下所示:

代码语言:javascript
复制
private readonly IDictionary<string,Assembly> additional =
    new Dictionary<string,Assembly>();

使用已知目录中的程序集加载此字典,如下所示:

代码语言:javascript
复制
foreach ( var assemblyName ... corresponding to DLL names in your directory... ) {
    var assembly = Assembly.Load(assemblyName);
    additional.Add(assembly.FullName, assembly);
}

为钩子提供一个实现...

代码语言:javascript
复制
private Assembly ResolveAssembly(Object sender, ResolveEventArgs e) {
    Assembly res;
    additional.TryGetValue(e.Name, out res);
    return res;
}

...and将其与事件关联起来:

代码语言:javascript
复制
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += ResolveAssembly;
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly;

这应该能起到作用。

票数 19
EN

Stack Overflow用户

发布于 2012-02-08 01:54:06

如果您知道计划反序列化的可能包含类型的程序集列表,那么在进行序列化之前,最好是直接预加载所有程序集。

当激发AssemblyResolve事件时,您不知道是什么类型导致了加载,只知道程序集名称。在这种情况下,不清楚为什么要按某种特定类型查找程序集。

请注意,如果两个程序集恰好具有相同的标识(即非强签名大小写的文件名),并且其中一个已加载,则即使在已加载的程序集中找不到类型,事件也不会在您预期的时候触发。

用于历史目的的文章链接:Resolving Assembly Loads

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9180638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档