同様のシナリオがあり、WPF ClickOnceアプリケーションが複数の環境で使用されており、app.configの唯一のものは接続文字列です。
クライアント/環境ごとに1つのパッケージをビルドするビルドプロセスがないと、clickonceパッケージ内の構成ファイルを変更できないという事実を回避するために、サーバー展開フォルダーにapp.configファイルを配置できるソリューションを考案しました。アプリケーションに実行時にアクセスさせます。
そのために、app.xaml.csOnStartupイベントで初期化する静的クラスを作成しました。
public static class DbConnectionString {public static string ConnectionString {get; プライベートセット; } public static string ActivationPath {get; プライベートセット; }
public static void Init()
{
string dbContext = "myDbContext";
string configFile = "App.config";
ConnectionString = "";
ActivationPath = "";
ActivationArguments actArg = AppDomain.CurrentDomain.SetupInformation.ActivationArguments;
if (actArg != null)
{
if (actArg.ActivationData != null)
{
try
{
var actData = actArg.ActivationData[0];
var activationPath = Path.GetDirectoryName(new Uri(actData).LocalPath);
var map = new System.Configuration.ExeConfigurationFileMap();
map.ExeConfigFilename = Path.Combine(activationPath, configFile);
var config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
var connectionStringSection = config.ConnectionStrings;
ConnectionString = connectionStringSection.ConnectionStrings[dbContext].ConnectionString;
ActivationPath = activationPath;
}
catch (Exception)
{
ConnectionString = "";
ActivationPath = "";
}
}
}
}
}
[公開]/[オプション]/[マニフェスト]の[プロジェクト設定]で、[URLパラメーターをアプリケーションに渡すことを許可する]にチェックマークを付けます
次に、接続文字列が必要な静的クラスのConnectionStringプロパティを使用します。アプリをオンラインのみとしてデプロイしない限り設定されないため、dev/testingのパッケージ内のapp.configがデフォルトになります。
少し複雑ですが、うまく機能します。アプリを1回公開し、ビルド間で変更されないインストールごとにapp.configを提供するだけで済みます。
また、clickonceサーバーのインストールディレクトリへのパスであるプロパティActivationPathを設定します。