我最近遵循了一个从 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.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 的误报还是存在“合规”方式?