存储程序集版本只读

时间:2012-10-19 10:21:30

标签: c# asp.net

这是我刚才问过的这个问题的后续问题:

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));
        }
    }

2 个答案:

答案 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