2015-10-15 23 views
1

我有一个VB.net应用程序使用自定义的可序列化类来保存配置设置。在启动时,我反序列化配置文件。这在调试器中完美工作。我在Visual Studio中运行应用程序,它调用LoadSettings函数,并实例化对象。但是,一旦我构建可执行文件并运行它,它会生成一个异常。有谁知道它为什么在调试器和编译代码之间有不同的表现?在EXE中发生XML反序列化异常,但在调试期间发生异常

配置文件的创建方式是通过序列化类Settings对象,然后使用StreamReader对象将其写入文件。非常简单,我一直都在这样做。

这里的子程序:

Private Sub LoadSettings(FromFile As String) 
    Dim ser As New XmlSerializer(GetType(UtilityClasses.Settings)) 
    Dim reader As New StreamReader(FromFile) 
    Settings = ser.Deserialize(reader) 
    reader.Close() 
End Sub 

而且,在ser.Deserialize()调用,它会引发此异常:

See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box. 

************** Exception Text ************** 
System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize ---> System.Configuration.ConfigurationErrorsException: Configuration file MyUtility.config does not have root <configuration> tag (C:\Data\Code\MyUtility\bin\Debug\MyUtility.config line 2) 
    at System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean ignoreLocal) 
    at System.Configuration.BaseConfigurationRecord.ThrowIfParseErrors(ConfigurationSchemaErrors schemaErrors) 
    at System.Configuration.BaseConfigurationRecord.ThrowIfInitErrors() 
    at System.Configuration.ClientConfigurationSystem.EnsureInit(String configKey) 
    --- End of inner exception stack trace --- 
    at System.Configuration.ConfigurationManager.PrepareConfigSystem() 
    at System.Configuration.ConfigurationManager.GetSection(String sectionName) 
    at System.Configuration.PrivilegedConfigurationManager.GetSection(String sectionName) 
    at System.Diagnostics.DiagnosticsConfiguration.GetConfigSection() 
    at System.Diagnostics.DiagnosticsConfiguration.Initialize() 
    at System.Diagnostics.DiagnosticsConfiguration.get_SwitchSettings() 
    at System.Diagnostics.Switch.InitializeConfigSettings() 
    at System.Diagnostics.Switch.InitializeWithStatus() 
    at System.Diagnostics.Switch.get_SwitchSetting() 
    at System.Diagnostics.BooleanSwitch.get_Enabled() 
    at System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(Type type, String defaultNamespace, XmlSerializerImplementation& contract) 
    at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) 
    at System.Xml.Serialization.XmlSerializer..ctor(Type type) 
    at CATPrd2Prt.Form1.LoadSettings(String FromFile) in C:\Data\Code\MyUtility\Form1.vb:line 99 
    at CATPrd2Prt.Form1.Form1_Load(Object sender, EventArgs e) in C:\Data\Code\MyUtility\Form1.vb:line 30 
    at System.EventHandler.Invoke(Object sender, EventArgs e) 
    at System.Windows.Forms.Form.OnLoad(EventArgs e) 
    at System.Windows.Forms.Form.OnCreateControl() 
    at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
    at System.Windows.Forms.Control.CreateControl() 
    at System.Windows.Forms.Control.WmShowWindow(Message& m) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
    at System.Windows.Forms.ContainerControl.WndProc(Message& m) 
    at System.Windows.Forms.Form.WmShowWindow(Message& m) 
    at System.Windows.Forms.Form.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 


************** Loaded Assemblies ************** 
mscorlib 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.3662 (GDR.050727-3600) 
    CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll 
---------------------------------------- 
CATPrd2Prt 
    Assembly Version: 1.0.0.0 
    Win32 Version: 1.0.0.0 
    CodeBase: file:///C:/Data/Clients/Inalfa/Code/CATPrd2Prt/CATPrd2Prt/bin/Debug/CATPrd2Prt.exe 
---------------------------------------- 
Microsoft.VisualBasic 
    Assembly Version: 8.0.0.0 
    Win32 Version: 8.0.50727.3053 (netfxsp.050727-3000) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualBasic/8.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll 
---------------------------------------- 
System 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.3662 (GDR.050727-3600) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll 
---------------------------------------- 
System.Windows.Forms 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.3667 (GDR.050727-3600) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll 
---------------------------------------- 
System.Drawing 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.3667 (GDR.050727-3600) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll 
---------------------------------------- 
System.Configuration 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.3654 (GDR.050727-3600) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll 
---------------------------------------- 
System.Xml 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.3662 (GDR.050727-3600) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll 
---------------------------------------- 
System.Runtime.Remoting 
    Assembly Version: 2.0.0.0 
    Win32 Version: 2.0.50727.3664 (GDR.050727-3600) 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Runtime.Remoting/2.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll 
---------------------------------------- 
Interop.INFITF 
    Assembly Version: 0.0.0.0 
    Win32 Version: 0.0.0.0 
    CodeBase: file:///C:/Data/Clients/Inalfa/Code/CATPrd2Prt/CATPrd2Prt/bin/Debug/Interop.INFITF.DLL 
---------------------------------------- 
System.Core 
    Assembly Version: 3.5.0.0 
    Win32 Version: 3.5.30729.1 built by: SP 
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Core/3.5.0.0__b77a5c561934e089/System.Core.dll 
---------------------------------------- 

************** JIT Debugging ************** 
To enable just-in-time (JIT) debugging, the .config file for this 
application or computer (machine.config) must have the 
jitDebugging value set in the system.windows.forms section. 
The application must also be compiled with debugging 
enabled. 

For example: 

<configuration> 
    <system.windows.forms jitDebugging="true" /> 
</configuration> 

When JIT debugging is enabled, any unhandled exception 
will be sent to the JIT debugger registered on the computer 
rather than be handled by this dialog box. 

回答

1

啊哈,想通了。显然,命名配置文件“MyUtility.config”导致解串器出现某种问题。但我不知道为什么它在调试过程中有所不同。我将名称更改为“MyUtility.config.xml”,它工作正常。

+0

我可以猜测,在VSHost调试器下,它必须使用不同的默认配置文件,因此不会尝试以不同的方式加载自定义文件。而在VSHost之外,它必须尝试加载自定义文件,因为它是一个预期的路径名,而且方式不同。 –