一个简单的问题。我有一个ASP.NET Web应用程序,其中包含几个程序集,我需要为网站中的每个程序集创建一个版本信息列表。 (也许甚至还有其他几个,但重点主要是网站本身。)
此列表将显示在受保护页面上的同一应用程序中,用于验证网站的安装和升级。当然,我可以浏览BIN文件夹中的所有二进制文件并从中提取信息,但是有更好的选择吗?
第二个问题:从另一个程序集中提取版本信息的最佳方法是什么?但我想之前有人问过,我自己也能找到答案。 (有反射的东西,GetExecutingAssembly和更多东西。)
答案 0 :(得分:6)
IEnumerable<String> GetLoadedAssemblies() {
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) {
yield return assembly.ToString();
}
}
为您提供应用程序域中使用的每个程序集的名称(包括版本号)。
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
等
使用它可能有一个问题:如果网站刚刚启动,那么你感兴趣的一些程序集可能还没有被加载到AppDomain中,因为它们不太可能被一个特殊页面引用功能就可以了。如果你首先点击网站以确保所有内容都已加载它应该可以正常工作,但如果你需要更强大的东西,你必须在上面的代码中添加一些AppDomain.Load()语句。
答案 1 :(得分:1)
您还可以使用Assembly类的GetReferencedAssemblies()方法获取Web应用程序引用的所有程序集。
答案 2 :(得分:1)
关于你的第二部分,我认为你很难从装配中获取信息而不加载它。如果您不打算实际使用该程序集,那么您可能不想随身携带,因为您无法从AppDomain卸载程序集。
查看创建一个新的AppDomain并在其中加载程序集以获取所需的信息。然后你可以扔掉新的appdomain,并在你完成后丢失所有的程序集引用。
以下是Using AppDomain to Load and Unload Dynamic Assemblies上的博文。
编辑:更好:Thread on StackOverFlow
答案 3 :(得分:1)
我掀起了这个页面:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Collections.Generic" %>
<%@ Import Namespace="System.Reflection" %>
<script runat="server">
void Page_Load(Object sender, EventArgs e)
{
List<string> assemblyNames = GetLoadedAssemblyNames(false);
StringBuilder sb = new StringBuilder();
foreach (string ass in assemblyNames)
{
sb.AppendFormat("{0}\n", ass);
}
this.Results.Text = sb.ToString();
}
private static List<string> GetLoadedAssemblyNames(bool hideSystem)
{
List<string> names = new List<string>();
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
string name = a.GetName().FullName;
if (hideSystem && (name.StartsWith("System.") || name.StartsWith("Microsoft.")))
{
continue;
}
names.Add(name);
}
names.Sort();
return names;
}
</script>
<html>
<body>
<form id="form1" runat="server">
<h1>Loaded Assemblies</h1>
<p><asp:Literal runat="server" ID="AppName" /></p>
<pre><asp:Literal runat="server" ID="Results" /></pre>
</form>
</body>
</html>