这是我刚才问过的这个问题的后续问题:
Assembly.GetExecutingAssembly() performance
这个解决方案似乎很完美。现在我只是勉强实施它并且它不起作用。我得到一个System.TypeInitializationException
抛出,内部异常是好的,Object reference not set to an instance of an object
。现在我不确定它为什么不起作用。我的猜测是static readonly
属性在大会课之前即时发布了什么?
任何人都可以对为什么发生这种情况有所了解,任何修复,除了不使用readonly,因为这是显而易见的,也欢迎,但不一定是预期的!
以下是代码:
public class VersionHelper
{
private static readonly Version _applicationVersion = Assembly.GetEntryAssembly().GetName().Version;
public static string GetVersionText()
{
return string.Format("Version: {0}-{1}", _applicationVersion, Environment.MachineName.Substring(5));
}
}
调用:
protected void Page_Load(object sender, EventArgs e)
{
lblVersion.Text = VersionHelper.GetVersionText();
}
只是为了解释我是否以这种方式工作:
public class VersionHelper
{
public static string GetVersionText()
{
Assembly web = Assembly.GetExecutingAssembly();
AssemblyName webName = web.GetName();
return string.Format("Version: {0}-{1}", webName.Version, Environment.MachineName.Substring(5));
}
}
答案 0 :(得分:2)
该例外与该属性是否为readonly没有任何关系。问题是你在ASP.NET上下文中调用Assembly.GetEntryAssembly(),显然这种方法并不能很好地协同工作。
您还使用此方法的另一个选项是,它使用Assembly.GetExecutingAssembly。如果您更改了第一个样本,那么它使用Assembly.GetExecutingAssembly,那么您将看到它运行正常。
我没有任何真实的参考资料,但您可以查看this问题,特别是问题下方的评论。
它还有一个关于如何在ASP.NET上下文中获取条目程序集的解决方案。
答案 1 :(得分:-1)
Assembly.GetEntryAssembly
不可靠,特别是当应用程序在非托管上下文而非托管上下文中启动时,它将返回NULL。结果必须为空检查..
例如,如果非托管应用程序创建用C#编写的COM组件的实例,则从C#组件调用GetEntryAssembly
方法将返回NULL,因为该进程的入口点是非托管代码而不是管理集会。
而GetExecutingAssembly
只获取包含当前正在执行的代码的程序集。
while要获取包含调用当前正在执行的代码的方法的程序集,您应该使用GetCallingAssembly
。