我最近遵循了一个示例,该示例用于从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.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 = neutral,PublicKeyToken = 8744b20f8da049e3”。
这仅仅是SonarLint的假阳性还是存在“兼容”方式?