C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: ビルドするとexe.configが上書きされてしまう


(過去ログ 130 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■76966 / inTopicNo.1)  ビルドするとexe.configが上書きされてしまう
  
□投稿者/ ロックマン (1回)-(2015/09/01(Tue) 15:50:11)

分類:[VB.NET/VB2005 以降] 

開発環境:VS2013
使用言語:C#

まだC#で数本しか開発していないですが、exe.configに設定値を持てると知り使っています。
ソリューションにプロジェクトが1つある状態です。
ビルドすると当然exe.configが作成されます。
この設定にデータベース先を持たせていて、設定では本番環境にしています。
当然作成されるexe.configは本番環境になっています。
開発中はexe.configをエディタでその部分をテスト用データベースに変更して動かしてます。
ここでソースを変更しようがビルドしてもexe.configは更新されることなく問題ありませんでした。
ちゃんとテスト用データベースで動いています。
これが普通と思ってました。

新たな開発でソリューションにプロジェクトが1つある状態でまず開発を始めました。
上記の通り問題はありませんでした。
ある時期に初ですがソリューションにもうひとつプロジェクトを追加しました。
プロジェクト追加は別の開発者がしたので、既に数ヶ月経ってるためどのようにプロジェクトを追加したかは覚えていないようです。
すると、最初のプロジェクトはソース変えようがexe.configは上書きされないので問題ないですが、
後から追加したプロジェクトはソース変えてビルドすると必ずexe.configが上書きされることが分かりました。
ビルドすると本番環境のexe.configになってしまい、毎回書き換えない限りテスト環境での設定で動かないという状態です。

過去の開発、このソリューションの最初のプロジェクトは問題ないのに、
後から追加したプロジェクトだけ必ず上書きされてしまい、
テスト環境のつもりがexe.configを書き換え忘れて、本番環境のデータベースを変更したりして困っています。

いろいろ見比べましたが、特に変わっている場所はありません。
違っていたのは、最初のプロジェクトのビルド項目の上のプラットフォームが「アクティブ(x86)」になっていて、
後から追加したプロジェクトのビルド項目の上のプラットフォームは「アクティブ(Any CPU)」になっています。
ただしプラットフォームターゲットは両方「x86」になっています。

exe.configを見比べましたが、違う点はありました。
最初のexe.configにはないですが、後のexe.configには
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
・・・・・
・・・・・
</dependentAssembly>
</assemblyBinding>
</runtime>
という設定がなぜか含まれています。

ソリューションエクスプローラで違う点は関係ないでしょうが、
最初のプロジェクトは、app.config
後のプロジェクトは、App.config
と最初の文字が大文字小文字の違いがあります。

exe.configを自分で編集した後は、ビルドしても上書きしないようにしたいのですが、何か方法はあるでしょうか?

よろしくお願い致します。
引用返信 編集キー/
■76968 / inTopicNo.2)  Re[1]: ビルドするとexe.configが上書きされてしまう
□投稿者/ 魔界の仮面弁士 (477回)-(2015/09/01(Tue) 16:32:23)
No76966 (ロックマン さん) に返信
> ビルドすると当然exe.configが作成されます。
.config が無い場合、「開発時に設定されていた値」が既定値として使われますので、
たとえアプリケーション構成ファイルを削除しても、アプリはそのまま動きますよ。
(Settings.Designer.cs 内に、DefaultSettingValueAttribute で記録されています)


> 必ずexe.configが上書きされることが分かりました。
どれが上書きされていますか?

(a) プロジェクトに含めている app.config の内容
(b) ビルド結果が出力されるフォルダの project1.exe.config の内容
(c) 実行時に Properties.Settings.Default で参照される内容
(d) (ユーザーフォルダ)\Local Settings\Application Data\CompanyName\(appdomainname)_(eid)_(hash)\1.0.0.0\user.config の内容


> 後から追加したプロジェクトのビルド項目の上のプラットフォームは「アクティブ(Any CPU)」になっています。
> ただしプラットフォームターゲットは両方「x86」になっています。

"x86" ビルドのプロジェクトを "上書きされるAny CPU" 構成で扱うのは混乱の元なので、
直しておいた方が良いと思いますが…何かそうすべき理由があったのでしょうか。


> exe.configを自分で編集した後は、ビルドしても上書きしないようにしたいのですが、
exe.config というのは、上記の (b) のことでしょうか?
だとしたら、(a) を編集する運用に変えた方が良いでしょう。


それとも、(a) を書き換えてはいないのに、(b)が別の内容で常時上書きされるということでしょうか。
だとすれば、Visual Studio のオプション設定画面を開き、
[プロジェクト及びソリューション]-[ビルド/実行]にて、
MSBuild のログ出力の範囲を広げてみてください。


そうすると、ビルド時の結果に
|
| タスク "Copy"
| "app.config" から "bin\Debug\project1.exe.config" へファイルをコピーしています。
|
のような内容が表示されるので、原因を追跡しやすくなるかもしれません。
引用返信 編集キー/
■76974 / inTopicNo.3)  Re[2]: ビルドするとexe.configが上書きされてしまう
□投稿者/ ロックマン (2回)-(2015/09/02(Wed) 11:41:07)
返信ありがとうございます。
書き込み遅くなりすいません。

>>ビルドすると当然exe.configが作成されます。
> .config が無い場合、「開発時に設定されていた値」が既定値として使われますので、
> たとえアプリケーション構成ファイルを削除しても、アプリはそのまま動きますよ。
> (Settings.Designer.cs 内に、DefaultSettingValueAttribute で記録されています)
これも一度ハマりましたが、ネット検索したらその事が書いてあり、分かりました。
こちらで発生したのはファイルはあるのに項目名がプログラムと違うのに動いてしまう現象になり、多分これと同等の理由だと思います。

>>必ずexe.configが上書きされることが分かりました。
> どれが上書きされていますか?
>
> (a) プロジェクトに含めている app.config の内容
> (b) ビルド結果が出力されるフォルダの project1.exe.config の内容
> (c) 実行時に Properties.Settings.Default で参照される内容
> (d) (ユーザーフォルダ)\Local Settings\Application Data\CompanyName\(appdomainname)_(eid)_(hash)\1.0.0.0\user.config の内容
最初のプロジェクトを「11111」、追加したのを「22222」と表記させてもらいます。
デバッグの結果表示を変更しました。

1>入力ファイル "obj\Release\22222.csproj.22222.exe.config" は出力ファイル "bin\Release\22222.exe.config" よりも新しいです。

という表示が出てますので「obj\Release\22222.csproj.22222.exe.config」が上書きされてると分かりました。
最初のプロジェクトでは、

1>すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "_CopyAppConfigFile" を省略します。

と出ているので上書きされていないようです。
追加したプロジェクトで「obj\Release\22222.csproj.22222.exe.config」がどこで更新されてるのかを追ってみました。

1>ターゲット "GenerateBindingRedirects" を完全にビルドしています。
1>入力ファイル EnvDTE, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a は存在しません。
1>"GenerateBindingRedirects" タスクをアセンブリ "Microsoft.Build.Tasks.v12.0, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" から使用しています。
1>タスク "GenerateBindingRedirects" (TaskId: 14)
1> タスク パラメーター:AppConfigFile=App.config
1> OriginalItemSpec=App.config
1> TargetPath=22222.exe.config (TaskId: 14)
1> タスク パラメーター:TargetName=22222.exe.config (TaskId: 14)
1> タスク パラメーター:OutputAppConfigFile=obj\Release\22222.csproj.22222.exe.config (TaskId: 14)
1> タスク パラメーター:
1> SuggestedRedirects=
1> EnvDTE, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
1> MaxVersion=8.0.0.0 (TaskId: 14)
1> MaxVersion "8.0.0.0" を使用して、"EnvDTE, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 上で推奨されるバインド リダイレクトを処理しています。 (TaskId: 14)
1>タスク "GenerateBindingRedirects" の実行が終了しました。 (TaskId: 14)

とあるので、ここで更新されてるようです。
最初のプロジェクトでは、

1>false 条件により、ターゲット "GenerateBindingRedirects" を省略しました。('$(AutoGenerateBindingRedirects)' == 'true' and '$(GenerateBindingRedirectsOutputType)' == 'true') は ('' == 'true' and 'true' == 'true') として評価されました。

と"GenerateBindingRedirects" は省略されています。
追加したプロジェクトは「PublicKeyToken=b03f5f7f11d50a3a は存在しません」と表示されてるのでこれが原因で更新されてる気がしてきました。
ただなぜ存在しないのかがデバッグ結果を見てもまだ分かりません。
時間が作れたら詳しく調べてみたいと思います。

> "x86" ビルドのプロジェクトを "上書きされるAny CPU" 構成で扱うのは混乱の元なので、
> 直しておいた方が良いと思いますが…何かそうすべき理由があったのでしょうか。
すいません、3人で開発してますが、全員C#の経験が浅い者なため、こうなった理由が不明です。
既にこの2つのプロジェクトが実運用してるので、動いてるものを変更して何か影響あるのは避けたいため今はそのままにしてます。
落ち着いたらx86に変更して、動作確認を実施したいと思ってます。

>>exe.configを自分で編集した後は、ビルドしても上書きしないようにしたいのですが、
> exe.config というのは、上記の (b) のことでしょうか?
> だとしたら、(a) を編集する運用に変えた方が良いでしょう。
私がapp.configを自分用データベース設定にして一時運用してました。
チェックインする時はそれ以外の変更分のみチェックインしていました。
ただ大量に修正し、ソリューションからチェックインした時にapp.configを除外しなかったため全員私のデータベースを見る環境になってしまいました。
3人が別々のデータベースを見るため3人ともデータベースの設定を自分用に書き換えてテストをしています。
テスト中、勝手にデータ書き換えられると検証できないため完全に別データベースでテストしてました。

> だとすれば、Visual Studio のオプション設定画面を開き、
> [プロジェクト及びソリューション]-[ビルド/実行]にて、
> MSBuild のログ出力の範囲を広げてみてください。
ありがとうございます。
ビルドの結果表示を変更できるとは知りませんでした。
今回このおかげでいろいろ原因を追うことができました。
大変助かりました。

今、別案件に入ったため、この調査はまた時間がとれた時にやりたいと思います。
多分「PublicKeyToken=b03f5f7f11d50a3a は存在しません」というのが原因だとは思います。
ざっとビルド結果見る限り、今はその原因は不明ですが。

大変有意義な情報を知ることができ、大変助かりました。
ありがとうございました。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -