Недавно я следовал примеру предварительной загрузки нескольких 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 или существует «совместимый» способ?