我正在尝试在运行时将dll加载到我的程序中,该dles与我设置的特定程序集属性相匹配。为了确保在检查其标志之前dll是可加载的,我已经编写了以下方法:
private bool IsValidDll(string dll) {
try {
System.Reflection.Assembly.LoadFrom(dll);
return true;
} catch (Exception ex) { return false; }
}
我可以遍历当前目录中的dll并调用此方法以查看加载dll并检查其程序集属性是否安全。但是,我正在点击一个没有抛出/捕获异常的DLL而且仍然只是直接崩溃程序。相关的输出窗口信息如下:
LoaderException: System.IO.FileLoadException: Mixed mode assembly is built against
version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information. - Adapters.Spryware.SprywareAdapter
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
我已经尝试捕获特定的Exception(System.IO.FileLoadException),但是catch块仍然被跳过,我仍然崩溃。有什么想法吗?
此外,我发现这是检查我的程序集属性的一种非常繁重的方式。有没有办法检查我的标志而不必先用Reflection加载dll?
答案 0 :(得分:0)
您可以通过将程序集加载到仅反射上下文中来解决此问题并减轻其负担。
基本上,这不是完全加载程序集,而是使您能够反映程序集,而无法执行实例化对象等操作。这明确允许您查看针对不同.NET框架版本构建的程序集,而不是运行应用程序的程序集。
MSDN上提供了彻底的处理:http://msdn.microsoft.com/en-us/library/ms172331.aspx
答案 1 :(得分:0)
不得不承认,我不明白为什么你的代码也不起作用:
我制作了一个.net 4的东西然后跑了,我的确抓住了它:
private void button1_Click(object sender, EventArgs e)
{
// foreach (String file in Directory.GetFiles("c:\\windows", "*.dll"))
String file = @"C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Data.dll";
{
try
{
//System.Reflection.Assembly.ReflectionOnlyLoadFrom(file);
System.Reflection.Assembly.LoadFrom(file);
}
catch (Exception ee)
{
textBox1.Text += ee.Message + Environment.NewLine;
}
}
}
单击文本框时显示: 无法加载文件或程序集'file:/// C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ System.Data.dll'或其依赖项之一。试图加载格式不正确的程序。