我有一个使用BinaryFormatter来反序列化对象的VS插件。为了解析这个对象的类型,它调用了Assembly.Load(objectTypeFullName),但是它触发了一个异常,因为Assembly.Load在它搜索的任何地方都找不到这个程序集。给定的程序集是外接程序程序集的同级程序集,但似乎Assembly.Load()在那里找不到它。
一种可能的解决方案是确定Assembly.Load应该在哪里查找程序集。
我该怎么办?
PS:我尽量不把这个程序集放在GAC上,因为我每次重新编译程序集时都需要更新它。
发布于 2010-10-16 03:05:51
您可以使用AppDomainSetup.PrivateBinPath添加其他专用搜索路径。这可以通过AppDomain.SetupInformation检索到。
另一种选择是订阅AppDomain.AssemblyResolve,以便在它找不到程序集时覆盖该行为。
发布于 2010-10-16 04:37:57
下面的代码片段展示了如何使用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框架版本4开始,ResolveEventArgs.RequestingAssembly属性返回请求无法解析的程序集加载的程序集...
如果您知道程序集相对于请求程序集的位置,则可以使用此方法。
发布于 2010-10-16 03:13:34
如果您只是试图确定程序集加载程序试图从何处加载dll,我建议您打开融合日志。这样做将使您能够获得输出,该输出将显示为相应的dll检查的每个路径。
其中有一个关于如何配置融合日志的MSDN article,还有一篇由Suzanne Cook撰写的关于如何调试加载失败的有用文章。如果启用LogFailures
,则应仅获得加载失败的程序集的输出。
https://stackoverflow.com/questions/3945240
复制相似问题