C# Bizzare ASP.net“;对象引用未设置为对象的实例;

C# Bizzare ASP.net“;对象引用未设置为对象的实例;,c#,asp.net,nullreferenceexception,C#,Asp.net,Nullreferenceexception,因此,请对导致此异常的原因进行一点概述 我已经在我的开发机器(WindowsXP,asp.NET4)上创建了一个网站,目标是.NET3.5。然后,我在后台机器(Windows7、ASP.NET2、IIS7.5)上部署了100%工作的网站 在整理了许多安全问题之后,我停止了这个令人困惑的异常,尽管我清楚地理解它的含义,但我无法理解为什么这个异常会来自堆栈跟踪中提到的行 …这就是你们要进来的地方!:) 因此,堆栈跟踪: [NullReferenceException: Object referenc

因此,请对导致此异常的原因进行一点概述

我已经在我的开发机器(WindowsXP,asp.NET4)上创建了一个网站,目标是.NET3.5。然后,我在后台机器(Windows7、ASP.NET2、IIS7.5)上部署了100%工作的网站

在整理了许多安全问题之后,我停止了这个令人困惑的异常,尽管我清楚地理解它的含义,但我无法理解为什么这个异常会来自堆栈跟踪中提到的行

…这就是你们要进来的地方!:)

因此,堆栈跟踪:

[NullReferenceException: Object reference not set to an instance of an object.]
   DVL.Ruby.Admin.Config.ConfigManager..ctor(String path) in C:\Documents and Settings\Andy\Desktop\SS_DVL\Displays\Ruby.root\Ruby\Ruby.Admin\Config\ConfigManager.cs:41
   DVL.Ruby.Admin.SettingGroups.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\Andy\Desktop\SS_DVL\Displays\Ruby.root\Ruby\Ruby.Admin\SettingStates.aspx.cs:33
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   System.Web.UI.Control.LoadRecursive() +50
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627
ConfigManager.cs

namespace DVL.Ruby.Admin.Config
{
    public class ConfigManager
    {
        private XElement m_appSettings;
        private XElement m_appMappings;
        private XElement m_appConnectionStrings;

        private List<Setting> m_settings;
        private List<ConnectionString> m_connectionStrings;

        private string m_path;

        private ConfigManager() { }

        private ConfigManager(string path)
        {
            if (path==null)
            {
                throw new NullReferenceException("The web.config path provided cannot be null.");
            }

            if (File.Exists(path)==false)
            {
                throw new ArgumentException("The web.config file does not exist.");
            }

            // Load the file
            XDocument configDocument = XDocument.Load(path);
            m_path = path; // <-- Line 41

      // Do some stuff...
        }

        /// <summary>
        /// Creates and returns a new instance of the ConfigManager
        /// </summary>
        /// <param name="path">The path of the web.config file to load.</param>
        /// <returns>A new instance of the ConfigManager</returns>
        public static ConfigManager Load(string path)
        {
            return new ConfigManager(path);
        }
这是奇怪的,因为我检查路径是否为null(并不是说它会产生差异),并且m_path已经为null,但这并不重要,因为我正在分配

在reflector中查看库时,我注意到编译后的版本更改为:

this.m_path = path;
我猜这给出了is可能失败的逻辑点(即“this”引用)。但为什么这是空的呢?这与创建对象实例的静态加载(字符串)方法有关吗?如果是这样,为什么它在我的开发pc上工作,而不是在部署计算机上工作

我很高兴能为这个对象提供一个普通的构造函数,但我只是在了解微软是如何开发他们的API(ala XDocument)的。我尝试再次使用reflector,看看他们是否以不同的方式实现了加载方法,但该方法是空的(可能是模糊的?)

总之,让我们总结一下,主要问题是:

  • 为什么它在第41行失败了
  • 为什么在我的开发机器上没有发生错误
    • 好的

      所以基本上,可能是一个noob错误。该网站是在发行版中编译的,我猜这意味着它没有包含所有的调试信息,因为行号是错误的(第41行应该是指向构造函数的指针,在那里发生了与config有关的更容易理解的问题)

      一切都很好,但我有点烦。版本中的ASP.net编译是否与控制台或其他应用程序不同?我肯定我有一个堆栈跟踪,上面有以前版本中的正确行

      另外,为什么行号在堆栈跟踪的更深处是正确的?i、 第33行是正确的。这纯粹是巧合吗

      助教


      Andy。

      你不应该抛出
      NullReferenceException
      。改为抛出一个
      ArgumentNullException
      。很好!但这对我的问题没有帮助!:(发布版本没有所有调试信息,所有注释都已删除等。因此,您无法获取代码错误的linie编号。但是,如果包含*.pdb文件,您仍然可以获取调试信息,因为它存储在.pdb文件中
      m_path = path;
      
      this.m_path = path;