c# - 扫描具有特定接口(interface)的 .NET 程序集的 DLL - 一些 DLL 抛出 R6034!

标签 c# .net reflection assemblies

我有一个程序需要在其主机上发现插件 DLL。

它通过枚举(相当大的)路径中的所有 DLL 来实现。此路径包含很多内容,包括 native DLL。

foreach (var f in Directory.EnumerateFiles(@"c:\Program Files", "*.dll", SearchOption.AllDirectories))
{
    try
    {
        var assembly = Assembly.LoadFile(f);
        var types = assembly.GetTypes();
        foreach (var type in types)
        {
            if (type.GetInterface("My.IInterface") != null)
            {
                plugins.Add(f);
                break;
            }
        }
        assembly = null;
    }
    catch (Exception e)
    {
    }
}

如果我的扫描器命中 MS 运行时 DLL(例如,msvcm80.dll),我会收到无法捕获的运行时错误 R6034:“应用程序已尝试错误地加载 C 运行时库。”该窗口阻止程序的执行。我不想要这个 DLL(显然);有没有什么办法可以从这种情况中得到一个优雅的错误?

[相关问题:如果 DLL 当前未加载到进程空间,是否有一种有效(例如非异常)方法来确定 DLL 是否为 .NET 程序集?]

最佳答案

首先使用 Assembly.ReflectionOnlyLoadFrom 进行仅反射加载.只有在程序集中找到插件后,才应使用 Assembly.LoadFrom 完全加载它。

要回答您的其他问题,您可以检查该文件是否具有 CLR header 。

See this post "Read CLR Header" on m.p.dotnet.framework

这些应该让您在搜索插件时避免任何异常和错误消息框。

关于c# - 扫描具有特定接口(interface)的 .NET 程序集的 DLL - 一些 DLL 抛出 R6034!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5035021/

相关文章:

java - Java 中的拆箱和反射?

c# - 如何在使用 FileSystemWatcher 监视多个文件夹的应用程序中监视多个共享文件

C#MVC : How to override configured authentication redirect?

c# - 适本地发出属性(property)

c# - 有哪些方法可以动态获取 DateTime.Now.AddDays(0..7) 的列表?

.net - 如何从包含程序集的字节数组中获取程序集名称?

c# - GetMethod 重载返回 null

scala - 使用 Scala 宏或反射实例化一个类

c# - 使用可用时间和不可用时间的历史记录,查找某个时间范围内的可用时间

c# - 当用户点击别处时隐藏表单