我有一个引用来自单独 VS 解决方案的 DLL 的应用程序。该应用程序当然是针对该 DLL 的特定版本构建的。然而,在运行时,可能存在不同(更高或更低)版本的 DLL。我希望该应用能够向用户显示它期望存在引用 DLL 的版本 X。
我如何检索(在运行时)应用构建所针对的引用 DLL 的版本?
请注意,以下解决方案给出了运行时存在的引用 DLL 的版本,这不是我想要的:
typeof(MyCompany.MyLibrary.SomeType).Assembly.GetName().Version
最佳答案
对此感兴趣并验证了几种方法。在下面的代码中,主程序集引用了 DummyDll.dll,它是针对此 dll 的版本 1.0.0.2 构建的,但实际上加载的是版本 1.0.0.3。然后我尝试 mono.Cecil、Assembly.GetReferencedAssemblies() 和相同但仅用于反射加载的程序集:
internal class Program {
private static void Main(string[] args) {
new Class1().Test(); // otherwise DummyDll will not be referenced.
var asm = Mono.Cecil.AssemblyDefinition.ReadAssembly(Assembly.GetEntryAssembly().Location);
foreach (var reference in asm.MainModule.AssemblyReferences) {
if (reference.FullName.Contains("DummyDll"))
Console.WriteLine(reference.FullName);
}
Console.WriteLine();
Console.WriteLine(typeof(Class1).Assembly.FullName);
Console.WriteLine();
foreach (var referenced in Assembly.GetEntryAssembly().GetReferencedAssemblies()) {
if (referenced.FullName.Contains("DummyDll"))
Console.WriteLine(referenced.FullName);
}
Console.WriteLine();
var asm2 = Assembly.ReflectionOnlyLoad(Assembly.GetEntryAssembly().FullName);
foreach (var referenced in asm2.GetReferencedAssemblies()) {
if (referenced.FullName.Contains("DummyDll"))
Console.WriteLine(referenced.FullName);
}
Console.ReadKey();
}
}
结果如下:
DummyDll,Version=1.0.0.2,Culture=neutral,PublicKeyToken=null
DummyDll,Version=1.0.0.3,Culture=neutral,PublicKeyToken=null
DummyDll,Version=1.0.0.2,Culture=neutral,PublicKeyToken=null
DummyDll,Version=1.0.0.2,Culture=neutral,PublicKeyToken=null
结果显示所有三种方法产生相同的结果,这就是您需要的结果。显示加载程序集真实版本的唯一方法是 typeof(Class1).Assembly。获得所需内容的最简单方法是使用 Assembly.GetReferencedAssemblies()。
关于C# - 获取应用程序构建所针对的引用 DLL 的版本(不是它在运行时引用的内容),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32502609/