C# - 获取应用程序构建所针对的引用 DLL 的版本(不是它在 运行 时间引用的内容)
C# - Get version of referenced DLL that app was built against (NOT what it references at run time)
我有一个引用来自单独 VS 解决方案的 DLL 的应用程序。该应用程序当然是针对该 DLL 的特定版本构建的。然而,在 运行 时间,可能存在不同(更高或更低)版本的 DLL。我希望该应用能够向用户显示它期望存在参考 DLL 的版本 X。
如何检索(在 运行 时间)构建应用程序所针对的引用 DLL 的版本?
请注意,下面的解决方案给出了在 运行 时间存在的引用 DLL 的版本,这不是我想要的:
typeof(MyCompany.MyLibrary.SomeType).Assembly.GetName().Version
您可以将有关引用的 dll 的信息存储在 app.config 中。但要小心,任何有权访问 app.config 的用户都可以更改此信息。如果我发现别的东西,我会报告给你。
Assembly.GetReferencedAssemblies 是否适用于您的情况?
.NET 程序集包含大量信息,包括构建它们所针对的程序集。
查看数据:
下载CFF Explorer
,拖入一个.net程序集,展开:
.NET Directory --> MetaData Streams --> #~ --> Tables --> AssemblyRef
有你要找的资料:)
现在要自动获取此信息,您可以深入研究所有这些信息的存储格式(这很有趣,尽管可能有点太多),或者您可以使用 Mono.cecil
,一个用于分析 .NET 模块的库。
如果需要示例,请查看 ILSpy
,一个 .net 反汇编程序。
另请阅读:https://en.wikipedia.org/wiki/Metadata_(CLI)
编辑:如果 BendEg
的解决方案对你有用,那比我描述的任何一个都简单得多:)
对此感兴趣并验证了几种方法。在下面的代码中,主程序集引用 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,版本=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.GetReferencedAssemblies().
我有一个引用来自单独 VS 解决方案的 DLL 的应用程序。该应用程序当然是针对该 DLL 的特定版本构建的。然而,在 运行 时间,可能存在不同(更高或更低)版本的 DLL。我希望该应用能够向用户显示它期望存在参考 DLL 的版本 X。
如何检索(在 运行 时间)构建应用程序所针对的引用 DLL 的版本?
请注意,下面的解决方案给出了在 运行 时间存在的引用 DLL 的版本,这不是我想要的:
typeof(MyCompany.MyLibrary.SomeType).Assembly.GetName().Version
您可以将有关引用的 dll 的信息存储在 app.config 中。但要小心,任何有权访问 app.config 的用户都可以更改此信息。如果我发现别的东西,我会报告给你。
Assembly.GetReferencedAssemblies 是否适用于您的情况?
.NET 程序集包含大量信息,包括构建它们所针对的程序集。
查看数据:
下载CFF Explorer
,拖入一个.net程序集,展开:
.NET Directory --> MetaData Streams --> #~ --> Tables --> AssemblyRef
有你要找的资料:)
现在要自动获取此信息,您可以深入研究所有这些信息的存储格式(这很有趣,尽管可能有点太多),或者您可以使用 Mono.cecil
,一个用于分析 .NET 模块的库。
如果需要示例,请查看 ILSpy
,一个 .net 反汇编程序。
另请阅读:https://en.wikipedia.org/wiki/Metadata_(CLI)
编辑:如果 BendEg
的解决方案对你有用,那比我描述的任何一个都简单得多:)
对此感兴趣并验证了几种方法。在下面的代码中,主程序集引用 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,版本=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.GetReferencedAssemblies().