控制台应用程序 - C# 在 EXE 中嵌入配置文件
本文关键字:配置文件 EXE 应用程序 控制台 | 更新日期: 2023-09-27 17:55:31
我有一个控制台程序"A",它将在给定点运行程序"B"和程序"C"。但是,我与每个程序关联的 app.config 出现问题。基本上程序A只是一个调用不同控制台应用程序的包装类,它不应该有任何app.config,但它应该使用当前正在运行的程序的应用程序配置。所以理论上应该只有 2 个 app.config,一个用于程序 B,另一个用于程序 C。
因此,如果我们运行程序 A 并且程序 B 被执行,它应该使用程序 B 的 app.config来获取信息,并且在程序 C 被执行后,它应该使用程序 C 的 app.config。
有没有办法做到这一点?目前我正在这样做:
var value = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location).AppSettings.Settings["ProgramBKey"].Value;
它似乎不起作用。我检查了调试Assembly.GetExecutingAssembly().Location
它的变量是''bin''Debug''ProgramB.exe和'ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly()。位置)。应用设置"在有键值时具有计数=0的设置,如下所示。
示例代码 程序 A:
static void Main(string[] args)
{
if(caseB)
B.Program.Main(args)
else if(caseC)
C.Program.Main(args)
}
程序 B 的示例 app.config:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="ProgramBKey" value="Works" />
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
</configuration>
编辑:以下答案与原始帖子中的这个问题有关,"是否可以在程序的exe中编译B和C的app.config。
您可以使用"嵌入式资源"功能。下面是使用作为嵌入资源包含的 XML 文件的小示例:
public static class Config
{
static Config()
{
var doc = new XmlDocument();
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Fully.Qualified.Name.Config.xml"))
{
if (stream == null)
{
throw new EndOfStreamException("Failed to read Fully.Qualified.Name.Config.xml from the assembly's embedded resources.");
}
using (var reader = new StreamReader(stream))
{
doc.LoadXml(reader.ReadToEnd());
}
}
XmlElement aValue = null;
XmlElement anotherValue = null;
var config = doc["config"];
if (config != null)
{
aValue = config["a-value"];
anotherValue = config["another-value"];
}
if (aValue == null || anotheValue == null)
{
throw new XmlException("Failed to parse Config.xml XmlDocument.");
}
AValueProperty = aValue.InnerText;
AnotherValueProperty = anotherValue.InnerText;
}
}
您可以使用同一个配置文件来使用多个应用程序。 这样,当您切换应用程序时,它们都可以找到自己的配置文件部分。
我通常的做法是...首先让每个应用程序"做自己的事情",然后将配置文件 A 的相关部分复制到配置文件 B 中。
它将看起来像这样:
<configSections>
<sectionGroup>
<sectionGroup name="applicationSettings"...A>
<sectionGroup name="userSettings"...A>
<sectionGroup name="applicationSettings"...B>
<sectionGroup name="userSettings"...B>
<applicationSettings>
<A.Properties.Settings>
<B.Properties.Settings>
<userSettings>
<A.Properties.Settings>
<B.Properties.Settings>
,整个事情听起来像是一个"设计问题"。为什么要使用程序 A 的配置打开程序 B?
您是所有这些程序的作者吗?您可能希望改用 dll 文件。这将为您省去麻烦,因为所有代码都在运行程序的配置的情况下运行。
以下是您如何做到这一点:
-
在属性/生成操作中将 App.config 设置为"嵌入的资源"
-
复制到输出目录:不复制
-
将此代码添加到 Proram.cs Main
if (!File.Exists(Application.ExecutablePath + ".config")) { File.WriteAllBytes(Application.ExecutablePath + ".config", ResourceReadAllBytes("App.config")); Process.Start(Application.ExecutablePath); return; }
以下是所需的功能:
public static Stream GetResourceStream(string resName)
{
var currentAssembly = Assembly.GetExecutingAssembly();
return currentAssembly.GetManifestResourceStream(currentAssembly.GetName().Name + "." + resName);
}
public static byte[] ResourceReadAllBytes(string resourceName)
{
var file = GetResourceStream(resourceName);
byte[] all;
using (var reader = new BinaryReader(file))
{
all = reader.ReadBytes((int)file.Length);
}
file.Dispose();
return all;
}