C#-获取应用程序构建所依据的引用DLL的版本(而不是它在运行时引用的)
我有一个应用程序,它引用了一个来自单独VS解决方案的DLL。应用程序当然是根据该DLL的特定版本构建的。但在运行时,可能存在不同(更高或更低)版本的DLL。我希望该应用程序能够向用户显示,它期望引用DLL的X版本出现 如何(在运行时)检索应用程序构建所依据的引用DLL的版本 请注意,以下解决方案给出了运行时存在的引用DLL的版本,,这不是我想要的版本:C#-获取应用程序构建所依据的引用DLL的版本(而不是它在运行时引用的),c#,.net,dll,build,reference,C#,.net,Dll,Build,Reference,我有一个应用程序,它引用了一个来自单独VS解决方案的DLL。应用程序当然是根据该DLL的特定版本构建的。但在运行时,可能存在不同(更高或更低)版本的DLL。我希望该应用程序能够向用户显示,它期望引用DLL的X版本出现 如何(在运行时)检索应用程序构建所依据的引用DLL的版本 请注意,以下解决方案给出了运行时存在的引用DLL的版本,,这不是我想要的版本: typeof(MyCompany.MyLibrary.SomeType).Assembly.GetName().Version您可以在app.c
typeof(MyCompany.MyLibrary.SomeType).Assembly.GetName().Version您可以在app.config中存储有关引用DLL的信息。但是要小心,任何有权访问app.config的用户都可以更改此信息。如果我发现其他事情,我会向你报告
NET程序集包含大量信息,包括它们是根据其生成的程序集 要查看数据: 下载
CFF Explorer
,在其中拖动.net程序集,然后展开:
.NET目录-->元数据流-->#~-->表-->AssemblyRef
这是您要查找的数据:)
现在,为了自动获取这些信息,您可以深入了解所有这些信息的存储格式(这很有趣,尽管可能有点太多),或者您可以使用Mono.cecil
,这是一个用于分析.NET模块的库
如果您想要一个示例,请看.net反汇编程序
另外,请阅读以下内容:
编辑:如果来自
BendEg
的解决方案对您有效,这比我描述的任何方法都要简单:)对此感兴趣并验证了一些方法。在下面的代码中,主程序集引用了DummyDll.dll,它是根据该dll的1.0.0.2版构建的,但实际上加载了1.0.0.3版。然后,我尝试mono.Cecil、Assembly.getReferenceAssemblys()和相同的方法,但仅针对反射加载的程序集:
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,版本=1.0.0.2,区域性=中立,PublicKeyToken=null
DummyDll,版本=1.0.0.3,区域性=中立,PublicKeyToken=null
DummyDll,版本=1.0.0.2,区域性=中立,PublicKeyToken=null
DummyDll,版本=1.0.0.2,区域性=中立,PublicKeyToken=null
结果表明,这三种方法都产生相同的结果,这就是您需要的结果。显示加载程序集的真实版本的唯一方法是typeof(Class1).assembly。因此,获得所需内容的最简单方法是使用Assembly.GetReferencedAssemblys()。谢谢!我不知道Assembly.GetReferencedAssemblys()。现在我看Assembly.GetReferencedAssemblys(),它确实生成了正确的版本。我认为埃夫克的回答是可以接受的,因为它有更多的细节,尽管你确实在他面前提出了这个想法。。。很抱歉