簡體   English   中英

如何在VS2010 C#控制台應用程序中將我的App.config編譯到我的exe中?

[英]How do I compile my App.config into my exe in a VS2010 C# console app?

我正在使用c#在Visual Studio 2010中創建一個控制台應用程序。 我希望這個應用程序是獨立的,因為你需要的只是exe,你可以從任何地方運行它。 我還想使用app.config來存儲連接字符串等。

我的問題是我似乎無法弄清楚如何將app.config數據包含到已編譯的exe中。 我確實看到它創建appname.exe.config,但我不希望人們在獲取應用程序時不必擔心抓取兩個單獨的文件。

我所做的谷歌搜索都沒有想出任何東西。 這甚至可能嗎?

你不能。 此類配置文件的一半要點是允許在應用程序本身之外更改應用程序的配置。

您只需修改程序,使其不依賴於應用程序配置文件 - 最簡單的方法是將配置中的值粘貼到只讀全局變量中。

我可以看到你要去哪里,但答案可能比你想要的要復雜一些。

  1. 使app.config成為嵌入式資源
  2. 手動解析app.config以獲取默認的應用程序設置/連接字符串/等
  3. 仍然查找app.config並覆蓋您之前使用app.config值讀取的默認值

這樣你有一些合理的默認值,你沒有必要將app.config作為常量保持獨立,你可以將你的應用程序作為一個exe運行,你仍然可以通過在app.config中添加回來在運行時修改它。

要記住的一件事是,從資源中讀取app.config不會給你與普通app.config相同的行為。 您基本上是在閱讀並手動使用它。

你的意思是你需要將它作為資源添加到exe? 好吧,首先你不能,app.config是基於文件而不是基於資源的。

另一方面,配置文件的唯一要點是您可以更改它。 否則只需硬編碼或使用常量。

正如其他人所指出的,配置文件背后的想法是避免使用硬編碼值。

您可以做的替代方法是編寫自定義配置部分,每個元素都是可選的,並且具有默認值。 這樣,任何可以使用默認值的人都不需要配置文件。 但如果他們需要覆蓋默認值,他們可以提供一個。

(對不起,只是一點頭腦風暴。我沒有可用的例子。)

最佳解決方法似乎是在應用程序啟動時自己創建它。

  1. 將App.Config添加為資源,將其重命名為“App_Config”
  2. 檢查配置文件是否存在
  3. 如果沒有,請寫入默認的.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);
        }
    }

請記住,它只會在構建時編寫當前配置。 部署新版本時,它不會自動更新。 它將包括構建時的配置。 但這可能就夠了:)

通常,您不希望這樣做,因為您的app.config提供了一種機制,通過該機制可以在運行時完成配置。 至於你的具體目標(維護代碼之外的配置,但讓它遵循二進制),你有幾個選擇:

  • 動態創建配置文件
  • 將設置存儲在注冊表中
  • 將設置存儲為控制台應用程序中的資源字符串

我相信還有其他更有創意的選擇。 我的建議是第二種選擇。 首次啟動應用程序時,創建必要的密鑰並從可執行文件中設置其默認值。 這樣,如果您需要在以后進行任何調試,您只需運行regedit並進行任何必要的更改,而無需重新編譯。

請在上一篇文章的第一個答案 - 配置文件作為嵌入式資源

就像人們在這里說的那樣,配置文件的重點是修改應用程序之外的一些設置。 您可以硬編碼或使用常量,但如果需要,您也可以在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。

快樂的編碼和祝你好運!

IL Merge與wpf可執行文件有很多問題也很慢。 我最終使用Cosura.Fody https://github.com/Fody/Costura並使用命令行參數傳遞我的應用配置值。 還使用iexpress http://en.wikipedia.org/wiki/IExpress創建最終可執行文件,命令行參數和exe合並在一起

以winform應用程序為例,在編譯期間,將生成文件'xxx.EXE.config'以及輸出EXE文件。 它將包含'app.config'設置。 也分發這個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM