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

Joe*_*Joe 7 .net c# reflection assemblies

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

它通过枚举(相当大)路径中的所有DLL来实现此目的.此路径包含许多内容,包括本机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)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*igt 10

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

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

请参阅mpdotnet.framework上的这篇文章"阅读CLR标题"

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