Assembly.LoadFile не соответствует? - PullRequest
0 голосов
/ 14 октября 2018

Недавно я следовал примеру предварительной загрузки нескольких DLL-файлов из папки bin, как описано здесь: https://stackoverflow.com/a/5599581/1099519

Это на самом деле работало, как и ожидалось, но я использую SonarLint для VisualStudio и в следующей строкекода подчеркнут и помечен как «Запах кода»:

Assembly.LoadFile(dll);

с указанием следующего S3885 (https://rules.sonarsource.com/csharp/RSPEC-3885):

Параметр для сборки.Загрузка включает в себя полную спецификацию DLL для загрузки. Используйте другой метод, и вы можете получить dll, отличную от той, которую вы ожидали.

Это правило вызывает проблему, когда Assembly.LoadFrom, Assembly.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 = нейтральный, PublicKeyToken = 8744b20f8da049e3".

Является ли это просто ложноположительнымот SonarLint или существует «совместимый» способ?

...