2011-01-03 5 views
27

私はC#でVisual Studio 2010にコンソールアプリケーションを作成しています。私はあなたが必要とするすべてがexeであり、どこからでもそれを実行できるという点で、このアプリを単独で使用したいと考えています。また、app.configを使用して接続文字列などを保存したいと考えています。VS2010 C#コンソールアプリケーションで、私のexeに私のApp.configをコンパイルするにはどうすればいいですか?

私の問題は、app.configデータをコンパイルされたexeファイルに組み込む方法がわからないということです。 appname.exe.configが作成されているのがわかりますが、アプリを入手したときに2つの別々のファイルを取得する心配はありません。

私が行ったグーグルは、何も思い付きませんでした。これも可能ですか?

+0

AFAIK設定ファイルをexeに含める方法はありません。設定が単純な場合は、自分のファイルに保存し、最初の実行時にそのファイルをデフォルト設定で作成するだけです。もう一つのオプションはWindowsのレジストリですが、それからVista上で昇格する必要があります(これは難しくありません) – gideon

+2

[組み込みリソースとしての設定ファイル](http://stackoverflow.com/questions/462583)/configuration-file-as-embedded-resource) –

+1

少し考えてみてください。可能であれば、ユーザーは接続文字列を変更できなくなりました。 1つのポイントを破る。 1つのファイルは決して問題ではない、それはsetup.exe –

答えて

13

あなたがすることはできません。そのような設定ファイルのポイントの半分は、アプリケーション自体の外でアプリの設定を変更できるようにすることです。

アプリの設定ファイルに依存しないようにプログラムを修正しなければならないでしょう。最も簡単な方法は、設定内の値を読み取り専用グローバル変数に固定することです。

+0

私は設定ファイルのポイントを逃したと思います。私はそれらを固めなければならないでしょう。 – Patches

+8

+1の間、この問題は、ツールがあなたのものではなくapp.configに何かを置くときです(たとえば、Webサービスへの参照を追加するときなど)。ユーザーは絶対に触れないでください。ただし、別のファイルに入れて出荷する必要があります。 Bonus stupidity:接続文字列を含む通常のアプリケーション設定がexeに埋め込まれます - あなたはexeだけを出荷することができ、それはデータベースに接続します。しかし、Webサービス参照の設定は埋め込まれず、参照するとすぐに '.config'を配布する必要があります。これはただのばかです。 – GSerg

+7

app.configが必要な唯一の理由は、何らかの理由でMicrosoftがアセンブリ自体の4.5.2要件にフラグを付けることができなかったためです。 –

3

一般的に、app.configは実行時に設定を行うためのメカニズムを提供しているので、これは望ましくありません。限り、あなた具体的な目標として、(あなたのコードの外形状を維持するが、それはバイナリに従っている)は、オプションのカップルがあります:

  • が動的に設定ファイル
  • ストアを作成し、レジストリ
  • の設定
  • ストアコンソールアプリケーション内のリソース文字列などの設定

私が利用可能な他、より創造的、オプションがあると確信しています。私のお勧めは、2番目の選択肢です。アプリケーションが最初に起動されたら、必要なキーを作成し、そのデフォルト値を実行可能ファイルから設定します。そうすれば、後でデバッグする必要がある場合は、単にregeditを実行して、再コンパイルせずに必要な変更を加えることができます。

+0

私は事を完全に独立させたかったので、私はレジストリだけを残しておきます。あなたのオプション3のように見える私の目的のために最高です。 – Patches

5

あなたはリソースとしてexeファイルに追加する必要があるということですか?まず、app.configはリソースベースではないファイルベースです。

一方、設定ファイルの唯一のポイントは、あなたがそれを変更できることです。それ以外の場合は、ハードコードや定数を使用してください。

8

私はあなたがこれでどこに行くのか見ることができますが、答えはあなたが探していたよりも少し複雑かもしれません。

  1. app.configを埋め込みリソースにします。
  2. 手動デフォルトアプリの設定/接続文字列を取得するためにはapp.configを解析/などが
  3. はまだApp.configファイルを探し、app.configをで先にあなたが読んでデフォルトを上書き

あなたはapp.configを定数として別々に管理する必要のない、いくつかの合理的なデフォルトを持っています。あなたのアプリは単なるexeとして実行することができます。 config。

覚えておいていただきたいのは、リソースからapp.configを読み込んでも、通常のapp.configと同じ動作が得られないということです。あなたは基本的にそれを読んでそれを手で使っています。

+1

うん、そうだね、ここのアイデアは、物事を楽にするのではなく、難しくする。私は自分のコードで設定オブジェクトを作成する方が良いと思われます。 – Patches

3

他の人も指摘しているように、構成ファイルの背後にある考え方は、ハードコードされた値を避けることです。

代替手段として行うことは、すべての要素をオプションとデフォルト値でカスタム設定セクションを作成することです。そうすれば、デフォルトで取得できる人ならconfigファイルは必要ありません。しかし、デフォルトを上書きする必要がある場合は、デフォルトを提供することができます。

(申し訳ありませんが、ブレーンストーミングの少しだけ。私は可能な例はありません。)

+6

残念ながらMicrosoft(ab)は設定以外の目的でこのファイルを使用しました。つまり、.NET 4.5アプリケーションが以前のバージョンの.NETでの実行を拒否するようにするために使用されます。これをユーザーが設定できるようにするための基本的な方法(シングルEXEアプリケーションを不可能にする)はそうではありませんか? –

3

人々はここに設定ファイルの全体のポイントを言っているのと同じように、アプリケーションの外にいくつかの設定を変更するためです。ハードコードや定数の使用は可能ですが、必要に応じて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でのみ機能します。私はおそらくあなたがWindowsを使用しているので、Visual Studioを使用していると仮定します。

ハッピーコーディングと幸運!

1

ILマージにもwpf実行可能ファイルで多くの問題があります。 私はCosura.Fody https://github.com/Fody/Costuraを使い、コマンドラインパラメータを使って自分のアプリの設定値を渡しました。 またiexpress http://en.wikipedia.org/wiki/IExpressを使用して、コマンドラインargsとexeが一緒にマージされた最終実行ファイルを作成してください。

3

アプリケーションの起動時に自分で作成するのが最適です。

  1. 、リソースとしてApp.configファイルを追加していない場合は、設定ファイルが
  2. が存在する場合は、 "App_Config"
  3. をチェックするために名前を変更し、デフォルトの.configファイルを書き込む

例コード:

プログラム.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); 
     } 
    } 

ビルド時に現在の設定のみを書き込むことに注意してください。新しいバージョンを展開すると、自動的に更新されません。ビルド時の設定をそのまま反映します。しかし、これで十分でしょう:)

+0

いくつかの使用例のための素晴らしいソリューションです。しかし、非常に多くの場合、インストーラは管理者権限で動作し、C:\ Program Filesにインストールできます。アプリケーション自体は管理者権限なしで実行されるため、EXEがインストールされているフォルダ(C:\ Program Filesなど)に書き込むことはできません。 – George

-2

たとえば、コンパイル時に、出力EXEファイルとともにファイル 'xxx.EXE.config'が生成されます。それには 'app.config'設定が含まれます。これも配布してください。

+1

-1 - それは私が特に避けようとしていたものでした。それを避ける方法は私の質問の全体だった。私は言った - 「私はappname.exe.configを作成するのを見ますが、人々は2つの別々のファイルをつかむことについて心配する必要はありません...」 – Patches

関連する問題