gpt4 book ai didi

c# - 使用 AppDomain.AssemblyResolve 事件

转载 作者:可可西里 更新时间:2023-11-01 08:41:34 25 4
gpt4 key购买 nike

我正在尝试使用 AppDomain.AssemblyResolve 事件来处理异常,同时解析运行时加载的某些 dll 的程序集 (SerializationException for dynamically loaded Type)。

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

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 不是很有用。

你能建议我一些解决方法吗?

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

最佳答案

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

private readonly IDictionary<string,Assembly> additional =
new Dictionary<string,Assembly>();

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

foreach ( var assemblyName ... corresponding to DLL names in your directory... ) {
var assembly = Assembly.Load(assemblyName);
additional.Add(assembly.FullName, assembly);
}

提供钩子(Hook)的实现...

private Assembly ResolveAssembly(Object sender, ResolveEventArgs e) {
Assembly res;
additional.TryGetValue(e.Name, out res);
return res;
}

...并将其连接到事件:

AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += ResolveAssembly;
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly;

这应该可以解决问题。

关于c# - 使用 AppDomain.AssemblyResolve 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9180638/

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