Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ConfigurationConverterBase.ConvertFrom引发的ArgumentException正在转义try/catch_C#_Configuration_Typeconverter_Configurationsection - Fatal编程技术网

C# ConfigurationConverterBase.ConvertFrom引发的ArgumentException正在转义try/catch

C# ConfigurationConverterBase.ConvertFrom引发的ArgumentException正在转义try/catch,c#,configuration,typeconverter,configurationsection,C#,Configuration,Typeconverter,Configurationsection,我已经创建了一个自定义的配置部分,其中包括一个IP地址值。为了正确地从配置文件中获取值,创建了一个类型转换器来解析IP地址。用于此测试的配置文件如下所示 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="mike" type="CustomConfigSection.SiteConfig, CustomCo

我已经创建了一个自定义的配置部分,其中包括一个IP地址值。为了正确地从配置文件中获取值,创建了一个类型转换器来解析IP地址。用于此测试的配置文件如下所示

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="mike" type="CustomConfigSection.SiteConfig, CustomConfigSection, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </configSections>
    <mike IPAddress="192.168.0.1a" />
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

即使您没有访问该属性本身,应用程序仍会在使其可用之前解析整个部分。解析发生在“config.Sections[“mike”]”处。但是,只有当您访问IPAddress属性时,才会出现异常。这回答了你的问题吗?@StfBln“只有当你访问IPAddress属性时,才会出现异常情况”。情况似乎并非如此。我在SiteConfig.Open()周围添加了一个try/catch,并在新行中添加了一个try/catch来访问IPAddress。在SiteConfig.Open期间发生异常。当访问IPAddress时,它不会“冒泡”。甚至VisualStudio编辑器调用堆栈也表示异常发生在SiteConfig.Open的config.Section[“mike”]中。当您运行代码时,是否发现异常发生在不同的位置?我的意思是,此异常是静默的,因为它不会冒泡。但是,在“SiteConfig hi=SiteConfig.Open();var test=hi.IPAddress;”中获取配置后,请尝试访问IPAddress;现在您将获得异常。@StfBln异常不是静默的。除了SiteConfig hi=SiteConfig.Open()之外,我已经注释掉了main中的所有内容。此方法调用失败。如果此方法对您成功,您使用什么来运行此代码?我刚刚将您的代码复制粘贴到一个空的控制台应用程序中,它可以正常工作。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Net;
using System.ComponentModel;

namespace CustomConfigSection
{
    public sealed class IPAddressConverter : ConfigurationConverterBase
    {
        public IPAddressConverter() { }

        public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
        {
            string ipaddress = ((string)value).ToLower();

            try
            {
                return IPAddress.Parse(ipaddress);
            }
            catch
            {
                throw new ArgumentException("The IPAddress contained invalid data.  The IPAddress provided was '" + ipaddress + "'.");
            }
        }

        public override object ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
        {
            return value.ToString();
        }
    }

    public class SiteConfig : ConfigurationSection
    {
        private SiteConfig() { }

        #region Public Methods
        public static SiteConfig Open()
        {
            if ((object)instance == null)
            {
                Configuration config = ConfigurationManager.OpenExeConfiguration(System.Reflection.Assembly.GetEntryAssembly().Location);

                try
                {
                    if (config.Sections["mike"] == null)
                    {
                        instance = new SiteConfig();
                        config.Sections.Add("mike", instance);
                        config.Save(ConfigurationSaveMode.Modified);
                    }
                    else
                        instance = (SiteConfig)config.Sections["mike"];
                }
                catch (Exception e)
                {
                    System.Diagnostics.Debug.WriteLine(e.Message.ToString());
                    System.Environment.Exit(-1);
                }
            }

            return instance;
        }
        #endregion Public Methods

        #region Properties
        [ConfigurationProperty("IPAddress")]
        [TypeConverter(typeof(IPAddressConverter))]
        public IPAddress IPAddress
        {
            get { return (IPAddress)this["IPAddress"]; }
            set { this["IPAddress"] = value; }
        }
        #endregion Properties

        private static SiteConfig instance = null;
    }
    class Program
    {
        static void Main(string[] args)
        {
            System.Diagnostics.Debug.WriteLine("Before Open.");
            SiteConfig hi = SiteConfig.Open();
            System.Diagnostics.Debug.WriteLine("After Open.");

            hi.IPAddress = IPAddress.Parse("192.168.0.1");
        }
    }
}