0

这是我不久前提出的这个问题的后续:

Assembly.GetExecutingAssembly() 性能

这个解决方案似乎很完美。现在我刚刚开始实施它,但它不起作用。我被System.TypeInitializationException抛出,内部异常是旧的,Object reference not set to an instance of an object. 现在我不确定为什么它不起作用。我的猜测是该static readonly属性是在 Assembly 类之前实例化还是什么?

任何人都可以解释为什么会发生这种情况,任何修复,除了不使用 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));
        }
    }
4

2 回答 2

2

该异常与该属性是否为只读这一事实没有任何关系。问题是您在 ASP.NET 上下文中调用 Assembly.GetEntryAssembly() ,显然这不能很好地协同工作。

您拥有的另一个选项也不使用此方法,它使用 Assembly.GetExecutingAssembly。如果您更改您的第一个示例以使其使用 Assembly.GetExecutingAssembly,那么您将看到它运行良好。

我没有任何真正的参考资料,但您可以查看这个问题,尤其是问题下方的评论。

它还有一个关于如何在 ASP.NET 上下文中获取条目程序集的解决方案。

于 2012-10-19T11:06:09.143 回答
-1

Assembly.GetEntryAssembly不可靠,特别是如果应用程序在非托管上下文而不是托管上下文中启动,它将返回 NULL。结果必须为空检查..

例如,如果非托管应用程序创建了一个用 C# 编写的 COM 组件的实例,GetEntryAssembly则从 C# 组件调用该方法将返回 NULL,因为进程的入口点是非托管代码而不是托管程序集。

GetExecutingAssembly只是获取包含当前正在执行的代码的程序集。

而要获取包含调用当前执行代码的方法的程序集,您应该使用GetCallingAssembly.

于 2012-10-19T10:45:26.337 回答