1

我试图在运行时将与我设置的特定程序集属性匹配的 dll 加载到我的程序中。为了确保在检查其标志之前 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.

我已经尝试捕获特定的异常(System.IO.FileLoadException),但是仍然跳过了捕获块并且我仍然崩溃。有什么想法吗?

另外,我发现这是检查我的程序集属性的一种非常繁琐的方法。有没有办法检查我的标志而不必先用反射加载 dll?

4

2 回答 2

0

通过将程序集加载到仅反射上下文中,您可能可以解决此问题并减轻负担。

基本上,这不是完全加载程序集,而是让您能够反映程序集,而无需执行诸如实例化对象之类的事情。这明确地允许您查看针对不同 .NET 框架版本构建的程序集,而不是运行您的应用程序的版本。

MSDN 上提供了彻底的处理:http: //msdn.microsoft.com/en-us/library/ms172331.aspx

于 2012-09-26T13:43:06.033 回答
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' 或其依赖项之一。试图加载格式不正确的程序。

于 2012-09-26T13:52:51.583 回答