我正在使用c#在Visual Studio 2010中创建控制台应用程序。我希望这个应用程序是独立的,只需要exe文件,就能在任何地方运行。我还想使用app.config存储连接字符串等信息。
我的问题是,我似乎无法将app.config数据包含到编译后的exe文件中。我确实看到它创建了appname.exe.config文件,但我不希望人们在获取应用程序时要担心抓取两个单独的文件。
我所做的所有谷歌搜索都没有找到答案。这可能有可能吗?
我正在使用c#在Visual Studio 2010中创建控制台应用程序。我希望这个应用程序是独立的,只需要exe文件,就能在任何地方运行。我还想使用app.config存储连接字符串等信息。
我的问题是,我似乎无法将app.config数据包含到编译后的exe文件中。我确实看到它创建了appname.exe.config文件,但我不希望人们在获取应用程序时要担心抓取两个单独的文件。
我所做的所有谷歌搜索都没有找到答案。这可能有可能吗?
你不能这样做。这种配置文件的一半目的是允许在应用程序本身之外更改应用程序的配置。
您只需修改程序,使其不依赖于应用程序配置文件 - 最简单的方法是将配置中的值放入只读全局变量中。
.config
文件。这很愚蠢。 - GSerguseLegacyJit
,因为您的代码 如此 直到今天仍会在 Win10 上由于 RyuJIT 的错误而崩溃。解决方法对于想要作为单个 exe 发布的程序是不可访问的,并且这绝不是任何意义上的用户设置。 - Roman Starkov我可以理解你的意思,但是答案可能比你想象的更加复杂。
这样,您就有了一些合理的默认值,无需将其与您的app.config保持为常量,您可以将应用程序仅作为exe运行,并且仍然可以通过添加app.config来在运行时修改它。
需要记住的一件事是,从资源中读取app.config不会给您与正常app.config相同的行为。您基本上是手动读取它并使用它。
您的意思是需要将其添加到exe中作为资源吗?首先,您无法这样做,app.config是基于文件而不是资源的。
另一方面,配置文件的唯一目的就是可以更改它。否则,只需硬编码或使用常量即可。
最佳解决方法似乎是在应用程序启动时自己创建。
示例代码:
Program.cs
[STAThread]
static void Main()
{
CreateConfigIfNotExists();
}
private static void CreateConfigIfNotExists()
{
string configFile = string.Format("{0}.config", Application.ExecutablePath);
if (!File.Exists(configFile))
{
File.WriteAllText(configFile, Resources.App_Config);
}
}
记住,在构建时,它只会写入您当前的配置。当您部署新版本时,它不会自动更新配置。它将在构建时按原样包含配置。但这可能已经足够了 :)
gcAllowVeryLargeObjects
设置为 true 时。这绝对是用户不应该触及的东西,因为如果禁用,它可能会导致程序崩溃。我很难相信这不是 VS 中项目属性的标准选项。 - Dan W就像这里的人们所说的一样,配置文件的整个目的是用于修改应用程序之外的某些设置。您可以硬编码或使用常量,但如果需要,也可以在Windows注册表中使用。这样,您可以对应用程序进行更改,仍然只有一个单独的exe文件。
代码项目提供了一些关于从注册表中读取、写入和删除信息的好资料。 http://www.codeproject.com/KB/system/modifyregistry.aspx 但是,在编辑注册表时要小心。许多应用程序都依赖它,因此如果您做错了什么,可能会破坏某些设置。我建议先阅读,然后再操作。
public string Read(string KeyName) {
RegistryKey rk = baseRegistryKey;
// Open a subKey as read-only
RegistryKey sk1 = rk.OpenSubKey(subKey);
// If the RegistrySubKey doesn't exist -> (null)
if ( sk1 == null )
{
return null;
}
else
{
try
{
// If the RegistryKey exists I get its value
// or null is returned.
return (string)sk1.GetValue(KeyName.ToUpper());
}
catch (Exception e)
{
// AAAAAAAAAAARGH, an error!
ShowErrorMessage(e, "Reading registry " + KeyName.ToUpper());
return null;
}
}
}
public bool Write(string KeyName, object Value) {
try
{
// Setting
RegistryKey rk = baseRegistryKey ;
// I have to use CreateSubKey
// (create or open it if already exits),
// 'cause OpenSubKey open a subKey as read-only
RegistryKey sk1 = rk.CreateSubKey(subKey);
// Save the value
sk1.SetValue(KeyName.ToUpper(), Value);
return true;
}
catch (Exception e) {
// AAAAAAAAAAARGH, an error!
ShowErrorMessage(e, "Writing registry " + KeyName.ToUpper());
return false;
}
}
public bool DeleteKey(string KeyName) {
try
{
// Setting
RegistryKey rk = baseRegistryKey ;
RegistryKey sk1 = rk.CreateSubKey(subKey);
// If the RegistrySubKey doesn't exists -> (true)
if ( sk1 == null )
return true;
else
sk1.DeleteValue(KeyName);
return true;
}
catch (Exception e)
{
// AAAAAAAAAAARGH, an error!
ShowErrorMessage(e, "Deleting SubKey " + subKey);
return false;
}
}
当然,这只适用于Windows操作系统。我假设你正在使用Visual Studio,因此你很可能在使用Windows。
祝编码愉快,好运!