web-dev-qa-db-ja.com

VS2010 C#コンソールアプリでApp.configをexeにコンパイルするにはどうすればよいですか?

Visual Studio 2010でC#を使用してコンソールアプリを作成しています。必要なのはexeだけで、どこからでも実行できるという点で、このアプリをスタンドアロンにしたいのです。また、app.configを使用して接続文字列などを保存したいと思います。

私の問題は、コンパイルされたexeにそのapp.configデータを含める方法がわからないように見えることです。 appname.exe.configが作成されるのはわかりますが、アプリを取得するときに2つの別々のファイルを取得することを心配する必要はありません。

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

30
Patches

できません。このような構成ファイルのポイントの半分は、アプリ自体の外部でアプリの構成を変更できるようにすることです。

アプリの設定ファイルに依存しないようにプログラムを変更する必要があります-それを行う最も簡単な方法は、設定内の値を読み取り専用グローバル変数に固定することです。

12
Billy ONeal

あなたはこれをどこに向かっているのかはわかりますが、答えはあなたが探していたよりも少し複雑かもしれません。

  1. App.configを埋め込みリソースにします。
  2. App.configを手動で解析して、デフォルトアプリの設定/接続文字列/などを取得します
  3. 引き続きapp.configを探し、先ほど読み込んだデフォルトをapp.configの値でオーバーライドします

このように、定数としてapp.configとは別に維持する必要のないいくつかの合理的なデフォルトがあり、アプリを単なるexeとして実行できます。また、app.configに追加して実行時に変更することもできます。 。

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

9
Alan Jackson

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

一方、設定ファイルの唯一のポイントは、変更できることです。それ以外の場合は、ハードコーディングするか、定数を使用します。

5
Aliostad

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

別の方法として、カスタム構成セクションを作成し、すべての要素をオプションでデフォルト値で記述することもできます。そうすれば、デフォルトで対処できる人は設定ファイルを必要としません。ただし、デフォルトをオーバーライドする必要がある場合は、デフォルトを提供できます。

(申し訳ありませんが、ちょっとしたブレインストーミングです。使用可能な例はありません。)

4
ThatBlairGuy

通常、app.configには実行時に構成を実行できるメカニズムが用意されているため、これを行うことは望ましくありません。特定の目標(コードの外部で構成を維持するが、バイナリに従うようにする)に関しては、いくつかのオプションがあります。

  • 構成ファイルを動的に作成する
  • 設定をレジストリに保存する
  • コンソールアプリケーション内の設定をリソース文字列として保存する

他にももっとクリエイティブなオプションが利用できると確信しています。私の推奨事項は、2番目のオプションです。アプリケーションを最初に起動するときに、必要なキーを作成し、実行可能ファイルからデフォルト値を設定します。そうすれば、後日デバッグを行う必要がある場合、regeditを実行して、再コンパイルせずに必要な変更を加えることができます。

3
Bobby D

最善の回避策は、アプリケーションの起動時に自分で作成するようなものです。

  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);
        }
    }

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

3
KoalaBear

この前の投稿の最初の回答をご覧ください- 埋め込みリソースとしての構成ファイル

2
Paige Cook

人々がここで言っているように、設定ファイルの重要なポイントは、アプリケーションの外部でいくつかの設定を変更することです。ハードコーディングまたは定数を使用できますが、必要に応じて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を使用していると思います。

幸せなコーディングと幸運を!

2
user1105582

IL Mergeにはwpf実行可能ファイルに関する多くの問題もあります。最終的にCosura.Fody https://github.com/Fody/Costura を使用し、アプリの構成値を渡すためにコマンドラインパラメーターを使用しました。また、iexpress http://en.wikipedia.org/wiki/IExpress を使用して、コマンドライン引数とexeがマージされた最終的な実行可能ファイルを作成します

1
Amit Chandel

.NETコンソールアプリケーション用の.exeファイルは作成しません。

代わりに、以下のコマンドプロンプトコマンドを使用してコンソールアプリケーションの.dllファイルを起動する必要があります(例として「Hello World」アプリケーションを使用しています)。

dotnet HelloWorld.dll

したがって、他の人が.exeファイルを使用してプログラムを起動できるようにしたいので、あなたが探していると思う答えは、コマンドプロンプトコマンドを実行するバッチファイルを作成することです。

その後、すべてのユーザーがプログラムを使用できるようになります。

「Hello World」アプリケーションを起動するバッチスクリプトの例は次のとおりです。

echo off
dotnet N:\SharedDriveFolder\HelloWorldProgramFolder\HelloWorld.dll

その後、プログラムが実行され、共有ドライブフォルダーにあるため、組織内のすべてのユーザーがプログラムを実行できます。

私はあなたの投稿に気づき、同じ問題があったので、これがあなたの質問に答えることを望みます。

.exeを探していたところ、この記事に出会うまでに約2時間の調査が必要でした https://docs.Microsoft.com/en-us/dotnet/core/tutorials/publishing-with- visual-studio これはすべてをまとめるのに役立ちました。

0
Mark S