.NET'te app.config veya web.config'den ayarları okuma


806

(DLL bir ASP.NET web uygulamasından veya bir Windows Forms uygulamasından başvurulmasına bağlı olarak) ayarları web.configveya app.configdosyadan okuyabilmesi gereken bir C # sınıf kitaplığı üzerinde çalışıyorum .

Onu buldum

ConfigurationSettings.AppSettings.Get("MySetting")

çalışır, ancak bu kod Microsoft tarafından kullanımdan kaldırılmış olarak işaretlenmiştir.

Ben kullanmalıyım okudum:

ConfigurationManager.AppSettings["MySetting"]

Ancak, System.Configuration.ConfigurationManagersınıf bir C # Sınıf Kitaplığı projesinden alınamıyor gibi görünüyor.

Bunu yapmanın en iyi yolu nedir?


48
Ben 4 MSDN örnekleri ve makaleler okumak gibi .. Ve buraya indi. Sadece referans ekleyin .. neden bunu söyleyemiyorlar. İyi soru! +1
Piotr Kula

1
Ayarları da tekrar yazmak istiyorsanız , buraya nasıl yapabileceğinize bakın.
Matt

Yanıtlar:


797

Sen gerekir başvurusu ekleyin için System.Configurationprojenizin içinde referanslar klasörüne .

ConfigurationManagerEski olanı kesinlikle kullanmalısın ConfigurationSettings.


Çok teşekkür ederim! çok basit bir cevap. Bir konsol uygulaması geliştiriyordum! ve bu cevap günü kurtarıyor!
PatsonLeaner

1
Bu hala .net çekirdeği için doğru mu?
Triynko

867

Aşağıdaki gibi örnek bir app.config dosyası için:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="countoffiles" value="7" />
    <add key="logfilelocation" value="abc.txt" />
  </appSettings>
</configuration>

Yukarıdaki uygulama ayarlarını aşağıda gösterilen kodu kullanarak okursunuz:

using System.Configuration;

Ayrıca System.Configurationhenüz yoksa projenize bir referans eklemeniz gerekebilir . Daha sonra aşağıdaki gibi değerlere erişebilirsiniz:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];

124
Cevabınızı kabul edilen cevaptan daha çok seviyorum. Örneklerle cevaplar benim için her zaman hile yapar.
Brendan Vogt

Bu benim için çalıştı. Ancak, benim System.Configuration bir ConfigurationManager içermiyor, bu yüzden ConfigurationSettings kullanmak zorunda kaldı. İronik olarak, hala eski olduğuna dair bir uyarı aldım.
Kabus Oyunları

13
Bu da bana oldu. System.Configuration başvurusunu eklemeyi denediniz mi? Sorun şu ki VS aslında sahip olduğunuzu düşünerek sizi kandırıyor; SystemlisConfiguration ad alanını almak için intellisense kullanabilirsiniz ancak ConfigurationManager sınıfına sahip değildir. Sadece referans ekleyin ve bu düzeltir.
Francine DeGrood Taylor

3
@Cricketheads System.Configuration ConfigurationManager'ı içeriyor, muhtemelen projenizde System.Configuration'a bir başvuru eksik.
TreK

2
Birisi neden System.Configuration'ın varsayılan olarak eklenmediğini düşündüğünü söyleyebilir mi? Bu çoğu uygulamada oldukça basit bir ihtiyaç gibi görünüyor.
Todd Vance

89

.NET Framework 4.5 ve 4.6 Güncelleştirmesi; aşağıdakiler artık çalışmaz:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

Şimdi Setting sınıfına Properties ile erişin:

string keyvalue = Properties.Settings.Default.keyname;

Daha fazla bilgi için bkz. Uygulama Ayarlarını Yönetme .


1
2010 yılından beri varlıklar .
Nick Westgate

1
Bunu gönderdiğiniz için çok teşekkürler. Properties.Settings.Default.MachName'in çalıştığını belirledim, ancak ConfigurationManager.AppSettings ["MachName"] öğesinin neden boş döndüğünü anlayamadım.
J. Chris Compton

1
Bu benim uzun süreli acımı sona erdirdi. Teşekkürler. Çerçeve sizi eski yolun eski olduğu konusunda uyarmalıdır.
Neil B

7
Onaylayamıyorum. ConfigurationManager.AppSettings ["someKey"], .NET 4.5, 4.6, 4.7.1
Ivanhoe

1
@Ivanhoe Hangi VisualStudio sürümünü kullandınız? ConfigurationManager.AppSettings ["someKey"], 4.6.1 ve VS 15.8.2 ile çalıştı, ancak 4.6.1 ve VS 15.9.2 ile benim için başarısız oldu.
kkuilla

37

Sınıf kitaplığınıza sağ tıklayın ve Menüden "Referans Ekle" seçeneğini seçin.

.NET sekmesinden System.Configuration'ı seçin. Bu, projenize System.Configuration DLL dosyasını içerir.


Referans ekledikten sonra yapabildiConfigurationManager.ConnectionStrings[0].ConnectionString
SushiGuy

29

Bunu kullanıyorum ve benim için iyi çalışıyor:

textBox1.Text = ConfigurationManager.AppSettings["Name"];

48
TS, açıkça aynı kodu kullandığını, ancak projesinin derlenemediğini (ortaya çıktığı gibi eksik referanslar nedeniyle) açıkça belirtiyor. Soruyu okumadığınız için -1.
Isantipov

23

Yapılandırmadan Okuyun:

Yapılandırmaya bir referans eklemeniz gerekir:

  1. Projenizde "Özellikler" i açın
  2. "Ayarlar" Sekmesine gidin
  3. "Ad" ve "Değer" ekleyin
  4. Aşağıdaki kodu kullanarak Değer Alın:

    string value = Properties.Settings.Default.keyname;

Yapılandırmaya kaydet:

   Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();

1
Bilginize: Google yanıtınızı en çok seviyor. "Get app config settings c #" kelimesini aradığınızda kelimesi kelimesine gösterilir
Steve Gomez


18

App.config dosyasını bir DLL dosyasına ekliyor olabilirsiniz. App.Config yalnızca yürütülebilir projeler için çalışır, çünkü tüm DLL dosyaları yapılandırmayı EXE dosyasının yapılandırma dosyasından alır.

Diyelim ki çözümünüzde iki proje var:

  • SomeDll
  • SomeExe

Sorununuz, AppExcon dosyasına değil, app.config dosyasını SomeDLL'e eklediğinizle ilgili olabilir. SomeDll, yapılandırmayı SomeExe projesinden okuyabilir.


Vay canına, bu belli değil. Birisi bunun hakkında konuşan bir belgeyi bağlayabilseydi, bu harika olurdu. Bu, araştırılması zor bir konudur.
David Krider

Bunun için teşekkürler. Bu hiçbir yerde ifade görmedim.
parametre

10

Bunu dene:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

Gelen web.config dosyasında bu sonraki yapı olmalıdır:

<configuration>
<appSettings>
<add key="keyname" value="keyvalue" />
</appSettings>
</configuration>

8

Ben de aynı problemi yaşadım. Bunları şu şekilde okuyun: System.Configuration.ConfigurationSettings.AppSettings ["MySetting"]


4
Microsoft'a göre ConfigurationSettings.AppSettings ile ilgili olarakThis method is obsolete, it has been replaced by System.Configuration!System.Configuration.ConfigurationManager.AppSettings
Peter M

2
bu yöntem eski
GabrielBB

7

web.configweb uygulamalarında kullanılır. web.configvarsayılan olarak web uygulaması için gereken çeşitli yapılandırmalara sahiptir. web.configWeb uygulamanızın altındaki her klasör için bir tane olabilir .

app.configWindows uygulamaları için kullanılır. Uygulamayı Visual Studio'da oluşturduğunuzda, otomatik olarak yeniden adlandırılır <appname>.exe.configve bu dosyanın uygulamanızla birlikte teslim edilmesi gerekir.

Her app settingsiki yapılandırma dosyasındaki değerleri çağırmak için aynı yöntemi kullanabilirsiniz : System.Configuration.ConfigurationSettings.AppSettings ["Key"]


System.Configuration.COnfigurationSettings.AppSettings.Get("Key")Köşeli parantez kullanmak yerine kullanmak da mümkündür .
Mason

7

Aşağıdaki gibi bir sarmalayıcı sınıf yaparak uygulama ayarları değişkenlerine sistematik bir şekilde erişmek için en iyi yaklaşım buldum.

public class BaseConfiguration
{
    protected static object GetAppSetting(Type expectedType, string key)
    {
        string value = ConfigurationManager.AppSettings.Get(key);
        try
        {
            if (expectedType == typeof(int))
                return int.Parse(value);
            if (expectedType == typeof(string))
                return value;

            throw new Exception("Type not supported.");
        }
        catch (Exception ex)
        {
            throw new Exception(string.Format("Config key:{0} was expected to be of type {1} but was not.",
                key, expectedType), ex);
        }
    }
}

Şimdi aşağıdaki gibi başka bir sınıf kullanarak gerekli ayar değişkenlerine sabit kodlu adlarla erişebiliriz:

public class ConfigurationSettings:BaseConfiguration
{
    #region App setting

    public static string ApplicationName
    {
        get { return (string)GetAppSetting(typeof(string), "ApplicationName"); }
    }

    public static string MailBccAddress
    {
        get { return (string)GetAppSetting(typeof(string), "MailBccAddress"); }
    }

    public static string DefaultConnection
    {
        get { return (string)GetAppSetting(typeof(string), "DefaultConnection"); }
    }

    #endregion App setting

    #region global setting


    #endregion global setting
}

Bu, OP'nin işaret ettiği yöntemi kullanımdan kaldırılmış olarak işaretler.
user2864740

4

Bu arama için bir sarıcı oluşturmanızı önemle tavsiye ederim . Bu sınıfı almak için a ConfigurationReaderServiceve bağımlılık enjeksiyonu gibi bir şey . Bu şekilde bu yapılandırma dosyalarını test amacıyla izole edebileceksiniz.

Bu yüzden ConfigurationManager.AppSettings["something"];önerileni kullanın ve bu değeri döndürün. Bu yöntemle, .config dosyasında kullanılabilir herhangi bir anahtar yoksa bir tür varsayılan dönüş oluşturabilirsiniz.


3
: Microsoft zaten bir Bulit şekilde birden aynı yapılandırma dosyası sürümlerini yönetmek zorundadır inşa yapılandırmaları : Her yapı yapılandırma için ayrı bir yapılandırma dosyaları olan izin, app.DEBUG.config, app.RELEASE.config, ve app.TEST.configvb
jpaugh

4

Ayrıca Formo'yu kullanabilirsiniz :

Yapılandırma:

<appSettings>
    <add key="RetryAttempts" value="5" />
    <add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" />
</appSettings>

Kod:

dynamic config = new Configuration();
var retryAttempts1 = config.RetryAttempts;                 // Returns 5 as a string
var retryAttempts2 = config.RetryAttempts(10);             // Returns 5 if found in config, else 10
var retryAttempts3 = config.RetryAttempts(userInput, 10);  // Returns 5 if it exists in config, else userInput if not null, else 10
var appBuildDate = config.ApplicationBuildDate<DateTime>();

5
Bunu neden dünyada yapmak istesin?
lukejkw

3

Sadece bütünlük için, sadece web projeleri için başka bir seçenek daha vardır: System.Web.Configuration.WebConfigurationManager.AppSettings ["MySetting"]

Bunun yararı, ilave bir referansın eklenmesi gerekmemesidir, bu nedenle bazı insanlar için tercih edilebilir.


3

Adım 1: Referans eklemek için referanslar sekmesine sağ tıklayın.

2. Adım: Montajlar sekmesini tıklayın

Adım 3: 'System.Configuration' öğesini arayın

4. Adım: Tamam'ı tıklayın.

Sonra işe yarayacak.

 string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];

2

Her zaman tüm yapılandırma değerleri için bildirilen typesafe özelliklerine sahip bir IConfig arabirimi oluştururum. Bir Config uygulama sınıfı daha sonra System.Configuration'a yapılan çağrıları sarar. Tüm System.Configuration çağrılarınız artık tek bir yerde ve hangi alanların kullanıldığını korumak ve izlemek ve varsayılan değerlerini bildirmek çok daha kolay ve temiz. Yaygın veri türlerini okumak ve ayrıştırmak için bir dizi özel yardımcı yöntem yazıyorum.

Bir IoC çerçevesi kullanarak , arabirimi bir sınıf yapıcısına geçirerek, uygulamanızın herhangi bir yerinde IConfig alanlarına erişebilirsiniz. Ayrıca, birim testlerinizde IConfig arabiriminin sahte uygulamalarını oluşturabilirsiniz, böylece artık App.config veya Web.config dosyanıza dokunmanıza gerek kalmadan çeşitli yapılandırma değerlerini ve değer kombinasyonlarını test edebilirsiniz.


1

Başka bir olası çözüm:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();

1

Birkaç gündür bu sorun için bir düzeltme bulmaya çalışıyorum. Bu sorunu web.config dosyasındaki appsettings etiketine bir anahtar ekleyerek çözebildim . Bu yardımcıyı kullanırken .dll dosyasını geçersiz kılmalıdır.

<configuration>
    <appSettings>
        <add key="loginUrl" value="~/RedirectValue.cshtml" />
        <add key="autoFormsAuthentication" value="false"/>
    </appSettings>
</configuration>

1

Aşağıdaki satırı kullanabilirsiniz. Benim durumumda çalışıyordu: System.Configuration.ConfigurationSettings.AppSettings ["anahtarAdınız"]

Yukarıdaki kod satırının da eski sürüm olmasına ve yeni kütüphanelerde kullanımdan kaldırılmasına dikkat etmelisiniz.


1

ConfigurationManager kendi ayarlarınıza erişmek için ihtiyacınız olan şey değildir.

Bunu yapmak için kullanmalısınız

{YourAppName}.Properties.Settings.{settingName}


1

.NET Core projeleri için aşağıdaki yaklaşımı çalıştırabildim:

Adımlar:

  1. Projenizde bir appsettings.json (aşağıda verilen biçim) oluşturun.
  2. Sonra bir yapılandırma sınıfı oluşturun. Biçim aşağıda verilmiştir.
  3. Configuration Class kullanımını göstermek için bir Login () yöntemi oluşturdum.

    Projenizde içerikle appsettings.json oluşturun:

    {
      "Environments": {
        "QA": {
          "Url": "somevalue",
     "Username": "someuser",
          "Password": "somepwd"
      },
      "BrowserConfig": {
        "Browser": "Chrome",
        "Headless": "true"
      },
      "EnvironmentSelected": {
        "Environment": "QA"
      }
    }
    
    public static class Configuration
    {
        private static IConfiguration _configuration;
    
        static Configuration()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.json");
    
            _configuration = builder.Build();
    
        }
        public static Browser GetBrowser()
        {
    
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Firefox")
            {
                return Browser.Firefox;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Edge")
            {
                return Browser.Edge;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "IE")
            {
                return Browser.InternetExplorer;
            }
            return Browser.Chrome;
        }
    
        public static bool IsHeadless()
        {
            return _configuration.GetSection("BrowserConfig:Headless").Value == "true";
        }
    
        public static string GetEnvironment()
        {
            return _configuration.GetSection("EnvironmentSelected")["Environment"];
        }
        public static IConfigurationSection EnvironmentInfo()
        {
            var env = GetEnvironment();
            return _configuration.GetSection($@"Environments:{env}");
        }
    
    }
    
    
    public void Login()
    {
        var environment = Configuration.EnvironmentInfo();
        Email.SendKeys(environment["username"]);
        Password.SendKeys(environment["password"]);
        WaitForElementToBeClickableAndClick(_driver, SignIn);
    }

1

Eğer ihtiyacınız varsa / kullanmak istiyorsanız ConfigurationManagerSınıfı ...

NuGet Paket YöneticisiSystem.Configuration.ConfigurationManager aracılığıyla Microsoft tarafından yüklemeniz gerekebilir

Araçlar-> NuGet Paket Yöneticisi-> Çözüm için NuGet Paketlerini Yönetin ...

Microsoft Dokümanlar

Dokümanlardan kayda değer bir şey ...

Uygulamanızın kendi yapılandırmasına salt okunur erişime ihtiyacı varsa, GetSection (String) yöntemini kullanmanızı öneririz. Bu yöntem, geçerli uygulama için Configuration sınıfından daha iyi performansa sahip önbelleğe alınan yapılandırma değerlerine erişim sağlar.


0

Lütfen üzerinde çalıştığınız .NET sürümünü kontrol edin. 4'ten daha yüksek olmalıdır. Ve uygulamanıza System.Configuration sistem kitaplığını eklemeniz gerekir.


3
Bu soru 9 yıl önce sorulmuştur ve her biri 600'den fazla oylamaya sahip 2'si de dahil olmak üzere 20'den fazla cevabı vardır, kabul edilen cevap System.Configuration'a bir referans eklemektir. Bu ek cevap değer katmaz. En iyi ihtimalle, bu kabul edilen cevaba bir yorum olmalıdır.
Richardissimo

Re "4'ten yüksek" : Ana sürüm numarasında mı? Yoksa "4.0'dan daha yüksek" mı demek istediniz ? Başka bir deyişle, .NET Framework 4.5 hangi tarafta olur ?
Peter Mortensen

-8

İşte bir örnek: App.config

<applicationSettings>
    <MyApp.My.MySettings>
        <setting name="Printer" serializeAs="String">
            <value>1234 </value>
        </setting>
    </MyApp.My.MySettings>
</applicationSettings>

Dim strPrinterName as string = My.settings.Printer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.