0

我最近遵循了一个从 bin 文件夹中预加载几个 DLL 的示例,如下所述: https ://stackoverflow.com/a/5599581/1099519

这实际上确实按预期工作,但我正在为 VisualStudio 使用 SonarLint,并且在以下代码行中加了下划线并标记为“代码气味”:

Assembly.LoadFile(dll);

陈述以下 S3885 ( https://rules.sonarsource.com/csharp/RSPEC-3885 ):

Assembly.Load 的参数包括要加载的 dll 的完整规范。使用另一种方法,您最终可能会得到一个与您预期不同的 dll。

当调用、 或时Assembly.LoadFrom,此规则会引发问题。Assembly.LoadFileAssembly.LoadWithPartialName

Assembly.Load(dll);所以我试了一下,按照建议改成了:

private const string BinFolderName = "bin";
public static void LoadAllBinDirectoryAssemblies(string fileMask)
{

    string binPath = System.AppDomain.CurrentDomain.BaseDirectory;

    if(Directory.Exists(Path.Combine(binPath, BinFolderName)))
    {
        binPath = Path.Combine(binPath, BinFolderName);
    }

    foreach (string dll in Directory.GetFiles(binPath, fileMask, SearchOption.AllDirectories))
    {
        try
        {
            Assembly.Load(dll); // Before: Assembly.LoadFile
        }
        catch (FileLoadException ex)
        {
            // The Assembly has already been loaded.
        }
        catch (BadImageFormatException)
        {
            // If a BadImageFormatException exception is thrown, the file is not an assembly.
        }

    }
}

但是使用推荐的方法FileLoadException会抛出:

无法加载文件或程序集“C:\SomePath\SomeDll.dll”或其依赖项之一。给定的程序集名称或代码库无效。(来自 HRESULT 的异常:0x80131047)

原因:该字符串Assembly.Load不是文件路径,实际上是类名如“SampleAssembly, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3”。

这仅仅是 SonarLint 的误报还是存在“合规”方式?

4

0 回答 0