Assembly.LoadFile是否不兼容?

时间:2018-10-14 19:17:47

标签: c# .net-assembly sonarlint sonarlint-vs

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

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

Assembly.LoadFile(dll);

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

  

Assembly.Load的参数包括完整的规范   dll被加载。使用另一种方法,您可能会得到一个dll   除了您期望的那个。

     

Assembly.LoadFromAssembly.LoadFile,   或调用Assembly.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的假阳性还是存在“兼容”方式?

0 个答案:

没有答案