我有一个VS加载项,它使用BinaryFormatter来反序列化对象。要解析此对象的类型,它调用Assembly.Load(objectTypeFullName),但它触发异常,因为Assembly.Load无法在其搜索的任何位置找到程序集。给定的程序集是加载项程序集的兄弟,但似乎Assembly.Load()在那里找不到它。
一种可能的解决方案是确定Assembly.Load应该在哪里寻找程序集。
我该怎么办?
PS:我正在尝试不将此程序集放在GAC上,因为每次重新编译程序集时都需要更新它。
答案 0 :(得分:4)
您可以使用AppDomainSetup.PrivateBinPath添加其他私人搜索路径。这可以通过AppDomain.SetupInformation检索。
另一种选择是订阅AppDomain.AssemblyResolve,以便在找不到程序集时覆盖行为。
答案 1 :(得分:4)
这是一段代码片段,展示了如何使用AssemblyResolve来解决你的程序集(根据Reed Copey的回答):
// register to listen to all assembly resolving attempts:
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
// Check whether the desired assembly is already loaded
private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
string desiredAssmebly = args.Name;
if (desiredAssembly.Equals("NameUsedToLoadMyAssembly")){
return Assembly.LoadFrom(myAssemblyPath);
}
return null;
}
另请注意,AssemblyResolve的MSDN页面指出:
从.NET Framework开始 版本4, ResolveEventArgs.RequestingAssembly property返回那个程序集 请求可能的装配负载 没有解决......
如果您知道程序集相对于请求程序集的位置,则可以使用此方法。
答案 2 :(得分:3)
如果您只是想确定程序集加载程序尝试加载dll的位置,我建议您打开Fusion日志。这样做将使您获得输出,该输出将显示为相应的dll检查的每个路径。
如何配置融合日志有MSDN article,Suzanne Cook有关如何调试加载失败的有用文章。如果打开LogFailures
,则只能获得无法加载的程序集的输出。