에 해당하는 있습니까 app.config
라이브러리 (DLL)에 대한이? 그렇지 않은 경우 라이브러리와 관련된 구성 설정을 저장하는 가장 쉬운 방법은 무엇입니까? 라이브러리는 다른 응용 프로그램에서 사용될 수 있습니다.
답변
당신은 수있는 별도의 구성 파일을 가지고,하지만 당신은이 “수동”를 읽을해야합니다 ConfigurationManager.AppSettings["key"]
어셈블리 실행 만 설정을 읽습니다.
Visual Studio를 IDE로 사용한다고 가정하면 원하는 프로젝트를 마우스 오른쪽 버튼으로 클릭 → 추가 → 새 항목 → 응용 프로그램 구성 파일
App.config
프로젝트 폴더에 추가 되고 <appSettings>
섹션 아래에 설정이 저장됩니다 . Visual Studio를 사용하지 않고 파일을 수동으로 추가하는 경우 파일 이름을 DllName.dll.config로 지정하십시오. 그렇지 않으면 아래 코드가 제대로 작동하지 않습니다.
이제이 파일을 읽으려면 다음과 같은 기능이 있습니다.
string GetAppSetting(Configuration config, string key)
{
KeyValueConfigurationElement element = config.AppSettings.Settings[key];
if (element != null)
{
string value = element.Value;
if (!string.IsNullOrEmpty(value))
return value;
}
return string.Empty;
}
그리고 그것을 사용하려면 :
Configuration config = null;
string exeConfigPath = this.GetType().Assembly.Location;
try
{
config = ConfigurationManager.OpenExeConfiguration(exeConfigPath);
}
catch (Exception ex)
{
//handle errror here.. means DLL has no sattelite configuration file.
}
if (config != null)
{
string myValue = GetAppSetting(config, "myKey");
...
}
ConfigurationManager 클래스를 사용하려면 System.Configuration 네임 스페이스에 대한 참조를 추가해야합니다.
프로젝트를 빌드 할 때 DllName.dll.config
파일 외에도 DLL 뿐만 아니라 DLL 자체로 게시 해야하는 파일입니다.
위의 기본 샘플 코드는 전체 예제에 관심이있는 사용자를위한 다른 답변을 참조하십시오 .
답변
불행히도 실행 파일 당 하나의 app.config 파일 만 가질 수 있으므로 응용 프로그램에 DLL이 연결되어 있으면 자체 app.config 파일을 가질 수 없습니다.
해결책은 다음과 같습니다.
App.config 파일을 클래스 라이브러리 프로젝트에 넣을 필요는 없습니다.
App.config 파일을 클래스 라이브러리의 dll을 참조하는 응용 프로그램에 넣습니다.
예를 들어 app.config 파일을 사용하는 MyClasses.dll이라는 클래스 라이브러리가 있다고 가정 해 보겠습니다.
string connect =
ConfigurationSettings.AppSettings["MyClasses.ConnectionString"];
이제 MyClasses.dll을 참조하는 MyApp.exe라는 Windows 응용 프로그램이 있다고 가정하겠습니다. 여기에는 다음과 같은 항목이있는 App.config가 포함됩니다.
<appSettings>
<add key="MyClasses.ConnectionString"
value="Connection string body goes here" />
</appSettings>
또는
xml 파일은 app.config와 가장 동일합니다. 필요에 따라 xml serialize / deserialize를 사용하십시오. 원하는대로 부를 수 있습니다. 구성이 “정적”이고 변경할 필요가없는 경우 프로젝트에 포함 된 리소스로 추가 할 수도 있습니다.
그것이 약간의 아이디어를 제공하기를 바랍니다.
답변
구성 파일은 응용 프로그램 범위이며 어셈블리 범위가 아닙니다. 따라서 라이브러리를 사용하는 모든 응용 프로그램의 구성 파일에 라이브러리의 구성 섹션을 배치해야합니다.
즉, 응용 프로그램의 구성 파일, 특히 appSettings
클래스 라이브러리 의 섹션 에서 구성을 얻는 것은 좋지 않습니다 . 라이브러리에 매개 변수가 필요한 경우 라이브러리를 호출하는 사람이 생성자, 팩토리 메서드 등에서 메서드 인수로 전달해야합니다. 이렇게하면 호출 응용 프로그램이 클래스 라이브러리에서 예상 한 구성 항목을 실수로 재사용하지 못하게됩니다.
즉, XML 구성 파일은 매우 편리하므로 내가 찾은 가장 좋은 방법은 사용자 지정 구성 섹션을 사용하는 것입니다. 라이브러리의 구성을 프레임 워크가 자동으로 읽고 구문 분석하는 XML 파일에 저장하면 잠재적 사고를 피할 수 있습니다.
MSDN의 사용자 지정 구성 섹션에 대해 자세히 알아볼 수 있으며 Phil Haack 에도 유용한 기사 가 있습니다.
답변
public class ConfigMan
{
#region Members
string _assemblyLocation;
Configuration _configuration;
#endregion Members
#region Constructors
/// <summary>
/// Loads config file settings for libraries that use assembly.dll.config files
/// </summary>
/// <param name="assemblyLocation">The full path or UNC location of the loaded file that contains the manifest.</param>
public ConfigMan(string assemblyLocation)
{
_assemblyLocation = assemblyLocation;
}
#endregion Constructors
#region Properties
Configuration Configuration
{
get
{
if (_configuration == null)
{
try
{
_configuration = ConfigurationManager.OpenExeConfiguration(_assemblyLocation);
}
catch (Exception exception)
{
}
}
return _configuration;
}
}
#endregion Properties
#region Methods
public string GetAppSetting(string key)
{
string result = string.Empty;
if (Configuration != null)
{
KeyValueConfigurationElement keyValueConfigurationElement = Configuration.AppSettings.Settings[key];
if (keyValueConfigurationElement != null)
{
string value = keyValueConfigurationElement.Value;
if (!string.IsNullOrEmpty(value)) result = value;
}
}
return result;
}
#endregion Methods
}
무언가를하기 위해, 나는 최고의 답변을 수업으로 리팩토링했습니다. 사용법은 다음과 같습니다.
ConfigMan configMan = new ConfigMan(this.GetType().Assembly.Location);
var setting = configMan.GetAppSetting("AppSettingsKey");
답변
Visual Studio에서 클래스 라이브러리 프로젝트에 설정을 추가하면 (프로젝트 속성, 설정), 관련 userSettings / applicatioNSettings 섹션과 설정에서 이러한 설정의 기본값을 사용하여 app.config 파일을 프로젝트에 추가합니다. 파일.
그러나이 구성 파일은 런타임에 사용되지 않으며 대신 클래스 라이브러리가 호스팅 응용 프로그램의 구성 파일을 사용합니다.
이 파일을 생성하는 주된 이유는 설정을 호스트 응용 프로그램의 구성 파일에 복사 / 붙여 넣을 수 있기 때문입니다.
답변
현재 소매 소프트웨어 브랜드의 플러그인을 만들고 있는데, 실제로는 .net 클래스 라이브러리입니다. 요구 사항으로 각 플러그인은 구성 파일을 사용하여 구성해야합니다. 약간의 연구와 테스트를 거친 후 다음 클래스를 컴파일했습니다. 완벽하게 작동합니다. 필자의 경우 로컬 예외 처리를 구현하지 않았으므로 더 높은 수준에서 예외를 잡을 수 있습니다.
소수와 두 배의 경우 소수점을 올바르게 조정해야 할 수도 있지만 CultureInfo에서 잘 작동합니다 …
static class Settings
{
static UriBuilder uri = new UriBuilder(Assembly.GetExecutingAssembly().CodeBase);
static Configuration myDllConfig = ConfigurationManager.OpenExeConfiguration(uri.Path);
static AppSettingsSection AppSettings = (AppSettingsSection)myDllConfig.GetSection("appSettings");
static NumberFormatInfo nfi = new NumberFormatInfo()
{
NumberGroupSeparator = "",
CurrencyDecimalSeparator = "."
};
public static T Setting<T>(string name)
{
return (T)Convert.ChangeType(AppSettings.Settings[name].Value, typeof(T), nfi);
}
}
App.Config 파일 샘플
<add key="Enabled" value="true" />
<add key="ExportPath" value="c:\" />
<add key="Seconds" value="25" />
<add key="Ratio" value="0.14" />
용법:
somebooleanvar = Settings.Setting<bool>("Enabled");
somestringlvar = Settings.Setting<string>("ExportPath");
someintvar = Settings.Setting<int>("Seconds");
somedoublevar = Settings.Setting<double>("Ratio");
Shadow Wizard & MattC의 크레딧
답변
원래 질문에 대한 응답으로, 나는 일반적으로 테스트 프로젝트에 구성 파일을 링크로 추가합니다. 그런 다음 DeploymentItem 속성을 사용하여 테스트 실행의 Out 폴더에 추가 할 수 있습니다.
[TestClass]
[DeploymentItem("MyProject.Cache.dll.config")]
public class CacheTest
{
.
.
.
.
}
어셈블리는 프로젝트에 따라 다를 수 없다는 의견에 응답 할 수 있으며 유연성이 뛰어납니다. IOC 프레임 워크로 작업 할 때