diff --git a/AGENTS.md b/AGENTS.md index b22623b2d..d208ad5cf 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -144,12 +144,12 @@ gh auth switch --user OsscJpDevInfra # 異なる場合は切り替え | 内容 | 読む文書 | |---|---| | **コーディング規約(全領域共通)** | [`CODING.md`](root/programs/CODING.md) | -| **設定ファイルの扱い(全領域共通)** | [`Configuration.md`](root/programs/Configuration.md) | +| **設定ファイルの扱い(全領域共通)** | [`CONFIGURATION.md`](root/programs/CONFIGURATION.md) | | `root/programs/CS/Frameworks/` の分析 | [`Frameworks/ANALYSIS.md`](root/programs/CS/Frameworks/ANALYSIS.md) | | `root/programs/CS/Samples/` の分析 | [`Samples/ANALYSIS.md`](root/programs/CS/Samples/ANALYSIS.md) | | `root/programs/CS/Samples4NetCore/` の分析 | [`Samples4NetCore/ANALYSIS.md`](root/programs/CS/Samples4NetCore/ANALYSIS.md) | -**設定ファイルに「仕組み」を書き足したくなったら、[`Configuration.md`](root/programs/Configuration.md) +**設定ファイルに「仕組み」を書き足したくなったら、[`CONFIGURATION.md`](root/programs/CONFIGURATION.md) に書く。** 設定ファイルは 86 個あり、一部にだけ詳しい説明があると、 **書かれていないファイルを「該当しない」と誤読させる。** 値の隣に書くのは「そのキーが何か」までにする(分担は同書 0 節)。 diff --git a/root/programs/0_RunAll.ps1 b/root/programs/0_RunAll.ps1 index 6c10012ff..7e36e53ad 100644 --- a/root/programs/0_RunAll.ps1 +++ b/root/programs/0_RunAll.ps1 @@ -1,29 +1,69 @@ # --- 引数 --- -# Lang : 対象の言語。CS(既定)/ VB / Both。1 と 3 にそのまま渡す。 +# Lang : 対象の言語。CS(既定)/ VB / Both。1 と 3 にそのまま渡す。 +# IgnoreErrors : 既知のエラーとして合否判定から外す正規表現。1 にだけ渡す。 +# +# **既定で ClickOnce の署名エラーを除外する。**(#555) +# WSClientWinCone_sample.csproj は証明書の拇印を直接指定しているため、 +# その証明書が無い環境では必ず失敗する(BUILDING.md 4 節)。 +# 既定で除外しないと、**「NG が 1 本ある」が常態になり、本物の失敗と見分けが付かない。** +# +# 除外したものは 1_BuildAll.ps1 が件数と内容を別枠で表示するので、黙って消えはしない。 +# 除外せずに回したいときは -IgnoreErrors @() を渡す。 [CmdletBinding()] param( [ValidateSet("CS", "VB", "Both")] - [string]$Lang = "CS" + [string]$Lang = "CS", + [string[]]$IgnoreErrors = @('error MSB(3482|3325|3321):.*WSClientWinCone_sample\.csproj') ) -# --- 処理部:他のps1ファイルを順次実行 --- +# --- 処理部 --- +# 1 → 2 → 3 を順に実行する。**その前に、設定ファイルの突き合わせを警告として行う**(#553)。 # ※ ダブル クリック起動でもカレント ディレクトリに依存しないよう $PSScriptRoot を使う。 # ※ 順序は固定(RELEASE.md 3 節)。1 のクリーンとアセンブリ配置が 2・3 の前提になる。 # # UseLang = $true のものにだけ -Lang を渡す。 # 2_RunAllTests.ps1 に渡さないのは、VB 側にテスト プロジェクトが無く(#542)、 # 単体テストが CS の Frameworks\Tests に集約されているため。 +# +# UseIgnore = $true のものにだけ -IgnoreErrors を渡す。 +# 受け取るのは 1_BuildAll.ps1 だけである(2 と 3 は同名の引数を持たない)。 # まとめの整形。Format-Table は 5.1 で全角の桁を数えないため、自前で揃える。 . (Join-Path $PSScriptRoot "SummaryTable.ps1") $scripts = @( - @{ Name = "1_BuildAll.ps1"; UseLang = $true } - @{ Name = "2_RunAllTests.ps1"; UseLang = $false } - @{ Name = "3_SmokeTest.ps1"; UseLang = $true } + @{ Name = "1_BuildAll.ps1"; UseLang = $true; UseIgnore = $true } + @{ Name = "2_RunAllTests.ps1"; UseLang = $false; UseIgnore = $false } + @{ Name = "3_SmokeTest.ps1"; UseLang = $true; UseIgnore = $false } ) $results = @() +# --- 設定ファイルの突き合わせ(警告のみ)---(#553) +# +# **合否には影響させない。** CS / VB の設定の差は、ビルドや疎通とは別の観点である。 +# ここで終了コードを汚すと、0_RunAll.ps1 の結果をそのまま合否として読めなくなる(#555)。 +# +# 一覧は出さない(25 行が毎回流れると、本来の検証ログが読みにくくなる)。 +# **異常があったときだけ「見に行け」と伝える。** +# +# -Lang に関わらず常に行う。比較は本質的に CS ↔ VB であり、片方だけを回すときにも意味がある。 +function Test-ConfigSync +{ + # **6>$null が要る。** Write-Host はパイプラインに流れないので、 + # | Out-Null では一覧を抑止できない(PowerShell 5.0 以降は情報ストリーム)。 + & (Join-Path $PSScriptRoot "CompareConfig.ps1") -Check 6>$null | Out-Null + return ($LASTEXITCODE -eq 0) +} + +$configOk = Test-ConfigSync +if (-not $configOk) +{ + Write-Host "" + Write-Host "【警告】設定ファイルに想定外の差分があります。" -ForegroundColor Yellow + Write-Host " .\CompareConfig.ps1 -Check で内容を確認してください。" + Write-Host "" +} + foreach ($s in $scripts) { # -Lang VB では単体テストの対象が無いので飛ばす。 @@ -36,10 +76,31 @@ foreach ($s in $scripts) } $splat = @{} - if ($s.UseLang) { $splat.Lang = $Lang } + if ($s.UseLang) { $splat.Lang = $Lang } + if ($s.UseIgnore) { $splat.IgnoreErrors = $IgnoreErrors } & (Join-Path $PSScriptRoot $s.Name) @splat $results += [pscustomobject]@{ スクリプト = $s.Name; 終了コード = $LASTEXITCODE } + + # --- bindingRedirect の突き合わせ(警告のみ)---(#556) + # + # **ビルドの直後に行う。** 見るのは「そのプロジェクトが配布するアセンブリ」なので、 + # ビルド前だと材料が無く「判定不能」ばかりになる。 + # 設定ファイルどうしを比べる CompareConfig.ps1(先頭で実行)とは、そこが違う。 + if ($s.Name -eq "1_BuildAll.ps1") + { + # 6>$null で一覧を抑止する(上と同じ理由)。 + & (Join-Path $PSScriptRoot "CompareRedirect.ps1") -Check 6>$null | Out-Null + $redirectOk = ($LASTEXITCODE -eq 0) + + if (-not $redirectOk) + { + Write-Host "" + Write-Host "【警告】bindingRedirect が、配布されないアセンブリの版を指しています。" -ForegroundColor Yellow + Write-Host " .\CompareRedirect.ps1 -Check で内容を確認してください。" + Write-Host "" + } + } } # --- 結果のまとめ --- @@ -49,8 +110,10 @@ Write-Host "" Write-SummaryTable $results Write-Host "" -# 1_BuildAll.ps1 は既知の署名エラー(MSB3482)で 1 になることがある。 -# 終了コードだけで判断せず、エラー一覧の内容を確認すること(RELEASE.md 3 節)。 +# **終了コードをそのまま合否として読んでよい。**(#555) +# 既知の署名エラー(MSB3482)は -IgnoreErrors の既定値で除外しているため、 +# 1_BuildAll.ps1 が 1 を返したら、それは**別の理由**である。 +# 除外した内容は 1_BuildAll.ps1 のサマリに別枠で出るので、そちらも目は通すこと。 # # 「対象外」は飛ばした印であって失敗ではないので、NG に数えない。 $ng = @($results | Where-Object { $_.終了コード -ne 0 -and $_.終了コード -ne "対象外" }) @@ -63,5 +126,21 @@ else Write-Host ("{0} 本が 0 以外で終了しました。上のログを確認してください。" -f $ng.Count) -ForegroundColor Yellow } +# 警告は、ここにも出す。 +# **通しは長い。途中の警告は流れて見落とされる。** +if (-not $configOk) +{ + Write-Host "" + Write-Host "【警告】設定ファイルに想定外の差分があります(CompareConfig.ps1 -Check)。" -ForegroundColor Yellow + Write-Host " 合否には数えていません。CONFIGURATION.md 11 節を参照。" +} + +if ($null -ne $redirectOk -and -not $redirectOk) +{ + Write-Host "" + Write-Host "【警告】bindingRedirect が、配布されないアセンブリの版を指しています" -ForegroundColor Yellow + Write-Host " (CompareRedirect.ps1 -Check)。合否には数えていません。" +} + # --- 画面を残すための処理 --- Read-Host "`nEnterキーを押すとウィンドウを閉じます" diff --git a/root/programs/1_BuildAll.ps1 b/root/programs/1_BuildAll.ps1 index 0a2f17e84..8dc99b32e 100644 --- a/root/programs/1_BuildAll.ps1 +++ b/root/programs/1_BuildAll.ps1 @@ -125,15 +125,15 @@ if ([Console]::OutputEncoding.CodePage -ne 65001) # SkipIfDone : 同じ実行内で同じバッチが既に走っていれば飛ばす(-Lang Both 用) $stepsCS = @( # --- net48 : 基盤 --- - @{ Name = "Clean (net48 基盤)"; Bat = "1_DeleteDir.bat"; Clean = $true } - @{ Name = "Clean files (net48 基盤)"; Bat = "1_DeleteFile.bat"; Clean = $true } + @{ Name = "Clean (net48 基盤)"; Bat = "1_DeleteDir.bat"; Clean = $true; SkipIfDone = $true } + @{ Name = "Clean files (net48 基盤)"; Bat = "1_DeleteFile.bat"; Clean = $true; SkipIfDone = $true } @{ Name = "NuGet (net48)"; Bat = "2_Build_NuGet_net48.bat" } @{ Name = "Business (net48)"; Bat = "3_Build_Business_net48.bat" } @{ Name = "Business.RichClient (net48)"; Bat = "3_Build_BusinessRichClient_net48.bat" } # --- netcore100 : 基盤 --- - @{ Name = "Clean (core 基盤)"; Bat = "1_DeleteDir.bat"; Clean = $true } - @{ Name = "Clean files (core 基盤)"; Bat = "1_DeleteFile.bat"; Clean = $true } + @{ Name = "Clean (core 基盤)"; Bat = "1_DeleteDir.bat"; Clean = $true; SkipIfDone = $true } + @{ Name = "Clean files (core 基盤)"; Bat = "1_DeleteFile.bat"; Clean = $true; SkipIfDone = $true } @{ Name = "NuGet (netcore100)"; Bat = "2_Build_NuGet_netcore100.bat" } @{ Name = "Business (netcore100)"; Bat = "3_Build_Business_netcore100.bat" } @{ Name = "Business.RichClient (core)"; Bat = "3_Build_BusinessRichClient_netcore100.bat" } @@ -142,8 +142,8 @@ $stepsCS = @( @{ Name = "CopyAssemblies"; Bat = "4_Build_CopyAssemblies.bat" } # --- net48 : ツールとサンプル --- - @{ Name = "Clean (net48 サンプル)"; Bat = "1_DeleteDir.bat"; Clean = $true } - @{ Name = "Clean files (net48 サンプル)"; Bat = "1_DeleteFile.bat"; Clean = $true } + @{ Name = "Clean (net48 サンプル)"; Bat = "1_DeleteDir.bat"; Clean = $true; SkipIfDone = $true } + @{ Name = "Clean files (net48 サンプル)"; Bat = "1_DeleteFile.bat"; Clean = $true; SkipIfDone = $true } @{ Name = "Framework_Tool (net48)"; Bat = "4_Build_Framework_Tool.bat" } @{ Name = "2CS_sample (net48)"; Bat = "5_Build_2CS_sample.bat" } @{ Name = "Bat_sample (net48)"; Bat = "5_Build_Bat_sample.bat" } @@ -154,8 +154,8 @@ $stepsCS = @( @{ Name = "WebApp_sample (net48)"; Bat = "10_Build_WebApp_sample.bat" } # --- netcore100 : ツールとサンプル --- - @{ Name = "Clean (core サンプル)"; Bat = "1_DeleteDir.bat"; Clean = $true } - @{ Name = "Clean files (core サンプル)"; Bat = "1_DeleteFile.bat"; Clean = $true } + @{ Name = "Clean (core サンプル)"; Bat = "1_DeleteDir.bat"; Clean = $true; SkipIfDone = $true } + @{ Name = "Clean files (core サンプル)"; Bat = "1_DeleteFile.bat"; Clean = $true; SkipIfDone = $true } @{ Name = "Framework_ToolCore"; Bat = "4_Build_Framework_ToolCore.bat" } @{ Name = "2CSCore_sample"; Bat = "5_Build_2CSCore_sample.bat" } @{ Name = "BatCore_sample"; Bat = "5_Build_BatCore_sample.bat" } @@ -296,8 +296,13 @@ $allKnown = New-Object System.Collections.Generic.List[string] $total = [Diagnostics.Stopwatch]::StartNew() # 実行済みのバッチ("フォルダ\バッチ名")。SkipIfDone の判定に使う。 -# ※ 1_DeleteDir.bat のように意図して繰り返すステップがあるため、 -#   一律の重複排除はしない。SkipIfDone を付けたものだけを対象にする。 +# ※ 一律の重複排除はしない。SkipIfDone を付けたものだけを対象にする。 +# +# **Clean は区画ごとに置いてあるが、実際に走るのは最初の 1 回だけ。**(#557) +# 1_DeleteDir.bat は bin を含めてカレント配下から再帰的に消すため、 +# 2 回目以降は**直前の区画でビルドした成果物を消してしまう。** +# 通しは元々クリーン ビルドなので、最初の 1 回で足りる。 +# 区画の区切りとしての表示は「実行済み」として残す(黙って消さない)。 $executed = @{} foreach ($s in $steps) diff --git a/root/programs/BUILDING.md b/root/programs/BUILDING.md index 62d254fa6..74c4df47f 100644 --- a/root/programs/BUILDING.md +++ b/root/programs/BUILDING.md @@ -850,3 +850,74 @@ VB の `.vbproj` は `Microsoft.Data.SqlClient` などを `PackageReference` で **ビルドの成否では気付けない。** 疎通確認(`3_SmokeTest.ps1 -Lang VB`)で初めて分かる。 実際、#533 で「VB の全ビルドが通る」ことを確認した後も、この不具合は残っていた。 + +--- + +## 11. 参照とパッケージを洗うとき(#554) + +`packages.config` と `` は**ビルドの入力**である。 +実行時の設定(`app.config` / `appsettings.json`)とは別なので、本書で扱う。 + +### 「参照が無い=不要」ではない + +`packages.config` の id を `csproj` の `` と突き合わせると、 +**8 プロジェクトで 48 件が「未参照」に見える。うち 44 件は消してはいけない。** + +| 種類 | 件数 | csproj に出るか | +|---|---|---| +| **サテライト**(`Xxx.ja`) | 25 | **出なくて正常**。`bin\ja\` に置かれるだけで、参照は本体が持つ | +| **コンテンツ**(bootstrap / jQuery / Modernizr 等) | 19 | **出なくて正常**。`Scripts\` `Content\` に展開されるだけ | +| **アセンブリで、どこからも参照されない** | 4 | 不要 | + +判定のしかたは次の通り。 + +- サテライト : **`.ja` を取った id が、同じ `packages.config` に在るか** +- コンテンツ : **展開物が実在するか**(`Content/bootstrap.css` `Scripts/jquery-*.js` 等) +- **メタ パッケージ**(`Microsoft.AspNet.WebApi` 等)は `packages\.\` に + `lib` を持たない。**中身が nupkg と EULA だけなら、それはメタである** + +### アセンブリ名がソースに出てこなくても、使われている + +`` 側も同じで、**アセンブリ名で grep しても当たらないが必要**なものがある。 + +| アセンブリ | 実際は | どこで分かるか | +|---|---|---| +| `System.Web.Http.WebHost` | `GlobalConfiguration` を提供する | `Global.asax.cs` の `GlobalConfiguration.Configuration` | +| `Microsoft.ScriptManager.MSAjax` / `.WebForms` | `` が使う | `.master` / `.aspx` | +| `System.Web.Razor` ほか 18 件 | **他のパッケージが要求する間接依存** | `.nuspec` の `` | + +**名前空間とアセンブリ名は一致しない。** `System.Web.Http.WebHost` が提供する型は +`System.Web.Http.GlobalConfiguration` で、ソースには `System.Web.Http` としか出ない。 + +> **`.nuspec` は展開されない。** +> `packages\.\` に在るのは `.nupkg`(ZIP)だけで、`.nuspec` はその中にしか無い。 +> 間接依存を調べるなら ZIP を開くこと。 +> +> **`packages` フォルダはプロジェクト直下とは限らない。** +> ソリューション階層に在ることが多く、`HintPath` が `..\packages\...` になっている。 + +### 通しビルドの対象外は、消してはいけない + +**消せるかどうかは「壊れていないことを確かめられるか」で決まる。** + +`DamDB2` の `IBM.Data.DB2.Entity` は、Entity Framework の痕跡が無く候補に見える。 +だが **`DamDB2` はどの `.sln` にも、どの `.bat` にも入っていない。** +消しても `0_RunAll.ps1` は何も言わないので、**判断の材料が得られない。** + +`CS/NuGet/proj` 配下を `CompareRedirect.ps1` の対象から外したのと同じ理屈である(#557)。 + +### 手順 + +```powershell +# 1. 参照の実体を確かめる(packages が復元されている必要がある) +.\1_BuildAll.ps1 + +# 2. 消す。csproj / vbproj には触らず、packages.config の行だけを消す +# メタ パッケージは lib を持たないので、読まれるアセンブリは変わらない + +# 3. 差分の行数を必ず見る。設定ファイルの編集は壊しやすい +git diff --numstat + +# 4. 検証する +.\0_RunAll.ps1 -Lang Both +``` diff --git a/root/programs/CHEATSHEET.md b/root/programs/CHEATSHEET.md index bb5a55e6c..f2bdd4578 100644 --- a/root/programs/CHEATSHEET.md +++ b/root/programs/CHEATSHEET.md @@ -30,10 +30,11 @@ cd root\programs **既定は C# 側。VB 側は `-Lang` で回す**(3 節)。 -- **`-IgnoreErrors` を付けないと `MSB3482` で NG になる。** ClickOnce の署名で、 - 証明書が無い環境では必ず出る([`BUILDING.md`](BUILDING.md) 4 節)。 - **`0_RunAll.ps1` はこれを渡さない**ので、`1_BuildAll.ps1` が `1` を返すことがある。 - 終了コードだけで判断せず、エラー一覧の内容を見ること +- **`1_BuildAll.ps1` を単体で回すときは `-IgnoreErrors` を付ける。** + ClickOnce の署名(`MSB3482`)で、証明書が無い環境では必ず出る + ([`BUILDING.md`](BUILDING.md) 4 節)。 + **`0_RunAll.ps1` は既定でこれを渡すので、付けなくてよい**(#555)。 + 除外した内容は件数つきで別枠に出るため、そちらは目を通すこと - `2_RunAllTests.ps1` は `Result*.txt` を書き換える。**差分 0 なら中身は同じ** - 前提(DB・サービス・IIS Express)は [`RELEASE.md`](RELEASE.md) 2 節 @@ -186,6 +187,7 @@ powershell.exe -NoProfile -Command "Set-Location 'root\programs'; .\3_SmokeTest. | `'xxx' is not recognized` が大量に出る | bat の非 ASCII とコード ページ | ASCII 化。[`CODING.md`](CODING.md) 4 節 | | `MSB4226`(`Microsoft.WebApplication.targets`) | nuget が別製品の MSBuild を拾った | `nuget.exe restore ... %NUGET_MSBUILD%` | | ビルドは通るのに `DllNotFoundException`(`...SNI...`) | `nuget restore` を呼んでおらず、ネイティブ DLL が出力に入らない | 該当 sln に restore を足す。[`BUILDING.md`](BUILDING.md) 10 節 | +| `packages.config` の id が `csproj` に無い=不要に見える | サテライト(`.ja`)とコンテンツ パッケージは**出なくて正常**(48 件中 44 件) | 消す前に [`BUILDING.md`](BUILDING.md) 11 節 | **NuGet パッケージ作成の落とし穴は [`CS/NuGet/README.md`](CS/NuGet/README.md) 9 節**にまとめてある。 diff --git a/root/programs/CONFIGURATION.md b/root/programs/CONFIGURATION.md index 8a260b033..b00222b20 100644 --- a/root/programs/CONFIGURATION.md +++ b/root/programs/CONFIGURATION.md @@ -240,10 +240,25 @@ csproj の `CopyToOutputDirectory` で出力フォルダへ配る前提なので 対処は 2 通りある。 -| 方針 | 手段(net10.0) | 手段(net48) | 実測 | -|---|---|---|---| -| **検知**(実態を知らせる) | `UseForwardedHeaders` | IIS の URL Rewrite で `HTTPS` を立てる | 4 件中 **3 件**に `secure` | -| **宣言**(そう決め打つ) | `CookieSecurePolicy=always` | `forms` の `requireSSL="true"` | 4 件中 **4 件** | +| 方針 | 手段(net10.0) | 手段(net48) | +|---|---|---| +| **検知**(実態を知らせる) | `UseForwardedHeaders` | IIS の URL Rewrite で `HTTPS` を立てる | +| **宣言**(そう決め打つ) | `CookieSecurePolicy=always` | `forms` の `requireSSL="true"` | + +**どちらも実測してある**(`X-Forwarded-Proto: https` を付けた要求で `Set-Cookie` を見る)。 + +| | 検知 | 宣言 | +|---|---|---| +| net10.0 | 4 件中 **3 件** | 4 件中 **4 件** | +| net48 | 6 件中 **2 件**(=フレームワークが立てる `SessionTimeOut` の生成・削除の両方) | — | + +net10.0 の検知が 3 件止まりなのは、**削除用 Cookie が +`CookieExtensions.Delete(key)`(オプション無し)を通る**ため。 +net48 側は削除も `newCookie.Secure` を明示しているので、両方に付く。 + +> **net48 では `allowedServerVariables` への登録も要る。** +> `Web.config` からは設定できず(`overrideModeDefault="Deny"`)、 +> `applicationHost.config` に書く。**忘れると要求ごとに HTTP 500.50 になる。** **宣言の方が依存が少なく確実。** `CookiePolicy` はすべての `Set-Cookie` を後段で 上書きするため、個々の箇所が何を判断しているかに依存しない。 @@ -289,6 +304,97 @@ Antiforgery の Cookie が返らず**ログインの POST が 400** になる( --- +### net48 で「検知」する — IIS の URL Rewrite + +**`Request.IsSecureConnection` はコードから変えられない**(読み取り専用)。 +IIS 側で `HTTPS` サーバ変数を立てる。 + +**MVC でも Web Forms でも同じ**である。設定するのは IIS であって、アプリの実装ではない。 + +#### ① `Web.config` に受信規則を書く + +```xml + + + + + + + + + + + + + + + + +``` + +`action type="None"` は「書き換えも転送もしない」。**サーバ変数を立てるためだけの規則**である。 + +#### ② `applicationHost.config` に `HTTPS` を登録する + +**これを忘れると、すべての要求が HTTP 500.50 になる。** + +``` +HTTP Error 500.50 - URL Rewrite Module Error. +The server variable "HTTPS" is not allowed to be set. +Add the server variable name to the allowed server variable list. +``` + +```xml + + + + + +``` + +**`Web.config` からは設定できない。** `allowedServerVariables` は +`overrideModeDefault="Deny"` で、`applicationHost.config` にしか書けない。 +アプリが勝手にサーバ変数を書き換えられないための関門である。 + +#### 実測(IIS Express、`Samples/WebApp_sample/MVC_Sample`) + +| 送ったヘッダ | `secure` が付いた Cookie | +|---|---| +| `X-Forwarded-Proto: https` | **6 件中 2 件**(`SessionTimeOut` の生成・削除の両方) | +| (ヘッダ無し) | 0 件 | +| `X-Forwarded-Proto: http` | 0 件(条件の `^https$` が弾く) | + +`SessionTimeOut` は `FxCmnFunction` が立てる Cookie なので、 +`IsSecureConnection` が true になったことの直接の確認になる。 + +> **ARR は要らない。** ARR は IIS 自身を**リバース プロキシにする**機能で、 +> ここで要るのは URL Rewrite だけ。前段が既にある構成なら ARR は無関係。 + +> **IIS Express で試すときの注意。** +> `/path:` 起動は `%ProgramFiles%\IIS Express\AppServer\applicationhost.config` を読む +> (`%USERPROFILE%\Documents\IISExpress\config\...` ではない)。 +> `/config:` は `/path:` と併用できず、`/site:` が要る。 + +### net48 で鍵を揃える — `machineKey` + +**Web サーバを複数台にするなら要る。** セッションを StateServer や SQLServer へ +外出ししても、それだけでは足りない。 + +**認証 Cookie(`forms`)と ViewState は `machineKey` で保護されている。** +指定しないと**サーバごとに別の鍵が自動生成される**ため、台数を増やした途端、 +片方が発行したものをもう片方が復号できず、 +ログインし直しや「ビューステートの検証に失敗しました」になる。 + +```xml + +``` + +**ViewState を使う Web Forms では、より当たりやすい。** +netcore 側の対応物は DataProtection(10 節)。 + +--- + ## 9. 秘密の扱い サンプルは**パスワードを直書きしている**(すぐ動かせることを優先しているため)。 @@ -327,7 +433,126 @@ dotnet dev-certs https --format Pem -ep ./https/aspnetapp.pem -np --- -## 11. 実例はどこにあるか +## 11. CS 版と VB 版で、どこが違ってよいか(#553) + +**`Samples` の設定ファイルは CS / VB でほぼ同じだが、完全には同じでない。** +**「同じはずだから」とコピーすると、VB 固有の記述が消える。**(実際に消した。#549 の作業中) + +### 突き合わせの結果(#553 時点の実測) + +対応する設定ファイル **25 組**を、XML の要素・属性で比較した +(コメント・空白・改行・BOM の差は無視)。 + +| | 組数 | +|---|---| +| 完全一致 | **8** | +| 差分あり | **17** | + +> **組数は必ず見ること。** +> 対応づけは「CS からの相対パスを VB に当てる」方式なので、 +> **階層が一致しないプロジェクトは 1 組も対象に入らない。** +> **「差分 0 件」と「対象に入っていない」は、出力の上では区別がつかない。** + +差分の種類は次のとおり(1 組が複数に該当することがある)。 + +| 種類 | 組数 | 判断 | +|---|---|---| +| `startup` / `supportedRuntime`(**VB のみ**) | 10 | **違ってよい**(VS が VB プロジェクトに自動で入れる) | +| `runtime/assemblyBinding` の `bindingRedirect` | 8 | **違ってよい**(NuGet が生成。参照するパッケージの版で変わる) | +| `packages.config` の構成 | 2 | **揃える**(下記) | +| `ClientSettingsProvider.ServiceUri`(VB のみ) | 1 | **違ってよい**(VS のテンプレート由来) | +| `SqlTextFilePath` の値 | 1 | **違わないといけない**(下記) | +| `compilation/assemblies`(VB のみ) | 1 | **違ってよい**(VB は明示参照が要ることがある) | +| 接続文字列の末尾の `;` | 1 | **要確認**(`ConnectionString_MCN`。CS だけ `;` が付く) | +| 要素の順序だけ | 1 | 無視してよい(`MVC_Sample/app.config`) | + +### **違わないといけない**もの — 埋め込みリソースの名前 + +`Samples/2CS_sample/GenDaoAndBatUpd_sample/app.config` + +``` +CS : +VB : +``` + +**同じにすると壊れる。** 埋め込みリソースの名前の作られ方が、言語で違うため。 + +| | マニフェスト名 | +|---|---| +| C# | `<RootNamespace>.<フォルダ>.<ファイル名>` | +| **VB** | `<RootNamespace>.<ファイル名>`(**フォルダ名が入らない**) | + +`RootNamespace` はどちらも `GenDaoAndBatUpd_sample`、`EmbeddedResource Include="Dao\..."` も +同じである。**違うのはコンパイラの規則の方**なので、設定値で吸収するしかない。 + +> `SqlTextFilePath` は「埋め込みリソースなら名前空間、通常のファイルならフォルダのパス」 +> という二役を持つ(`MyBaseDao.SetSqlByFile2`)。5 節・7-3 節も参照。 + +### `packages.config` も突き合わせの対象である + +拡張子が `.config` なので元から対象に入っている。**`$allowed` には入れていない。** + +見るのは、**陳腐化した宣言**(`packages.config` にしか出てこないパッケージ)と +**`targetFramework` の残留**(プロジェクトの `TargetFrameworkVersion` と食い違う宣言)である。 + +**どちらもビルドは通る。** だから検査でしか見つからない。 + +> `packages.config` の見方(サテライト・コンテンツ・メタ パッケージの区別)は +> [`BUILDING.md`](BUILDING.md) 11 節。**「参照が無い=不要」ではない。** + +### 揃えるときの原則 + +**丸ごとコピーしない。** 上のとおり、丸ごと同じにしてよいファイルは 25 組中 8 組しかない。 + +**差分の行数を必ず見る。** コメントを 16 行足したはずが `+23/−53` になっていたことで、 +実際に事故に気付けた。 + +``` +git diff --numstat +``` + +**値が変わっていないことは、機械的に確かめられる。** +[`CompareConfig.ps1`](CompareConfig.ps1) が、XML の要素・属性だけを取り出して突き合わせる。 +コメント・空白・改行・BOM の差は落ちるので、**値の差だけが残る。** + +```powershell +cd root\programs +.\CompareConfig.ps1 # 一覧 +.\CompareConfig.ps1 -Detail -Only "WebApp_sample" # 内訳 +.\CompareConfig.ps1 -Check # 合否(想定外の差分があれば 1) +``` + +**`-Check` は「差分の有無」ではなく「想定外の差分の有無」を見る。** +上の表で「違ってよい」とした種類(`startup` / `runtime` / `compilation/assemblies` / +`SqlTextFilePath` / `ClientSettingsProvider.*`)は、当てはまれば想定内として扱う。 + +``` +================ 判定 ================ + **想定外の差分 2 件** + + Samples\WebApp_sample\WebForms_Sample\WebForms_Sample\Web.config + /configuration/connectionStrings/... [connectionString=...Database=test2;...] +``` + +**許容する種類を増やすときは、なぜ違ってよいのかをこの節にも書くこと。** +スクリプトの `$allowed` だけに足すと、**理由が残らない。** + +**そして、足す前に「なぜ違うのか」を履歴で確かめること。** +**「差がある」ことと「違ってよい」ことは別である。** +理由が「片側だけ作業が済んでいない」なら、**許容ではなく、作業を終わらせるのが答え**になる。 +`$allowed` に入れてしまうと、**やり残しが「仕様」として固定される。** + +`compilation/assemblies` の欠落と接続文字列の `;` は、この方法で見つけた。 + +> **CI は代わりにならない。** +> VB の疎通テストは 6 対象しか動かさないため、**差分のあるファイルの半分以上は +> 一度も実行されない。** 実行される分でも `compilation/assemblies` の欠落は +> `0_RunAll.ps1 -Lang Both` を通過した(実測)。 +> **CI は「壊れていないこと」の証拠にはなるが、「意図どおり」の証拠にはならない。** + +--- + +## 12. 実例はどこにあるか | 見たいもの | 場所 | |---|---| diff --git a/root/programs/CS/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/Web.config b/root/programs/CS/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/Web.config index 15575de49..df56db378 100644 --- a/root/programs/CS/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/Web.config +++ b/root/programs/CS/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/Web.config @@ -100,7 +100,7 @@ - + diff --git a/root/programs/CS/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/packages.config b/root/programs/CS/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/packages.config index 08bd76d76..2e0bfa983 100644 --- a/root/programs/CS/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/packages.config +++ b/root/programs/CS/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/packages.config @@ -10,13 +10,11 @@ - - @@ -41,7 +39,6 @@ - diff --git a/root/programs/CS/Frameworks/Tests/EncAndDecUtilCUI/App.config b/root/programs/CS/Frameworks/Tests/EncAndDecUtilCUI/App.config index 2bbe77154..a0cefc2f3 100644 --- a/root/programs/CS/Frameworks/Tests/EncAndDecUtilCUI/App.config +++ b/root/programs/CS/Frameworks/Tests/EncAndDecUtilCUI/App.config @@ -4,7 +4,7 @@ - + diff --git a/root/programs/CS/Frameworks/Tests/TestBatch/SimpleBatch/app.config b/root/programs/CS/Frameworks/Tests/TestBatch/SimpleBatch/app.config index 23471593b..37b78c456 100644 --- a/root/programs/CS/Frameworks/Tests/TestBatch/SimpleBatch/app.config +++ b/root/programs/CS/Frameworks/Tests/TestBatch/SimpleBatch/app.config @@ -60,7 +60,7 @@ - + diff --git a/root/programs/CS/Frameworks/Tests/TestCode/Result48.txt b/root/programs/CS/Frameworks/Tests/TestCode/Result48.txt index 21c473f5c..daae30db0 100644 --- a/root/programs/CS/Frameworks/Tests/TestCode/Result48.txt +++ b/root/programs/CS/Frameworks/Tests/TestCode/Result48.txt @@ -70,11 +70,11 @@ log4net: Setting Collection Property [AddFilter] to object [log4net.Filter.Level log4net: Created Appender [OPERATION2] log4net: Adding appender named [OPERATION2] to logger [OPERATION]. log4net: Hierarchy Threshold [] -[2026/08/14 02:49:43,862],[DEBUG],[1],LogIF.DebugLog("ACCESS"); -[2026/08/14 02:49:43,881],[INFO ],[1],LogIF.InfoLog("ACCESS"); -[2026/08/14 02:49:43,882],[WARN ],[1],LogIF.WarnLog("ACCESS"); -[2026/08/14 02:49:43,882],[ERROR],[1],LogIF.ErrorLog("ACCESS"); -[2026/08/14 02:49:43,882],[FATAL],[1],LogIF.FatalLog("ACCESS"); +[2026/08/16 21:23:40,219],[DEBUG],[1],LogIF.DebugLog("ACCESS"); +[2026/08/16 21:23:40,233],[INFO ],[1],LogIF.InfoLog("ACCESS"); +[2026/08/16 21:23:40,234],[WARN ],[1],LogIF.WarnLog("ACCESS"); +[2026/08/16 21:23:40,234],[ERROR],[1],LogIF.ErrorLog("ACCESS"); +[2026/08/16 21:23:40,235],[FATAL],[1],LogIF.FatalLog("ACCESS"); ---------------------------------------------------------------------------------------------------- GetMessage: ~メッセージID:I0001に対応する記述(正常系)~ GetMessage: ~メッセージID:E0001に対応する記述(異常系)~ diff --git a/root/programs/CS/Frameworks/Tests/TestCode/ResultCore100.txt b/root/programs/CS/Frameworks/Tests/TestCode/ResultCore100.txt index cca14a9d0..d61d2650d 100644 --- a/root/programs/CS/Frameworks/Tests/TestCode/ResultCore100.txt +++ b/root/programs/CS/Frameworks/Tests/TestCode/ResultCore100.txt @@ -70,11 +70,11 @@ log4net: Setting Collection Property [AddFilter] to object [log4net.Filter.Level log4net: Created Appender [OPERATION2] log4net: Adding appender named [OPERATION2] to logger [OPERATION]. log4net: Hierarchy Threshold [] -[2026/08/14 02:49:51,630],[DEBUG],[2],LogIF.DebugLog("ACCESS"); -[2026/08/14 02:49:51,659],[INFO ],[2],LogIF.InfoLog("ACCESS"); -[2026/08/14 02:49:51,661],[WARN ],[2],LogIF.WarnLog("ACCESS"); -[2026/08/14 02:49:51,662],[ERROR],[2],LogIF.ErrorLog("ACCESS"); -[2026/08/14 02:49:51,662],[FATAL],[2],LogIF.FatalLog("ACCESS"); +[2026/08/16 21:23:48,945],[DEBUG],[2],LogIF.DebugLog("ACCESS"); +[2026/08/16 21:23:48,975],[INFO ],[2],LogIF.InfoLog("ACCESS"); +[2026/08/16 21:23:48,976],[WARN ],[2],LogIF.WarnLog("ACCESS"); +[2026/08/16 21:23:48,977],[ERROR],[2],LogIF.ErrorLog("ACCESS"); +[2026/08/16 21:23:48,978],[FATAL],[2],LogIF.FatalLog("ACCESS"); ---------------------------------------------------------------------------------------------------- GetMessage: ~メッセージID:I0001に対応する記述(正常系)~ GetMessage: ~メッセージID:E0001に対応する記述(異常系)~ diff --git a/root/programs/CS/Frameworks/Tools/DPQuery_Tool/app.config b/root/programs/CS/Frameworks/Tools/DPQuery_Tool/app.config index 27be04dec..ac0176047 100644 --- a/root/programs/CS/Frameworks/Tools/DPQuery_Tool/app.config +++ b/root/programs/CS/Frameworks/Tools/DPQuery_Tool/app.config @@ -241,7 +241,7 @@ - + diff --git a/root/programs/CS/Frameworks/Tools/DaoGen_Tool/app.config b/root/programs/CS/Frameworks/Tools/DaoGen_Tool/app.config index 2a857af9b..114a15a02 100644 --- a/root/programs/CS/Frameworks/Tools/DaoGen_Tool/app.config +++ b/root/programs/CS/Frameworks/Tools/DaoGen_Tool/app.config @@ -238,7 +238,7 @@ - + diff --git a/root/programs/CS/Samples/2CS_sample/2CSClientWPF_sample/app.config b/root/programs/CS/Samples/2CS_sample/2CSClientWPF_sample/app.config index d5cbf4270..1d8d59b78 100644 --- a/root/programs/CS/Samples/2CS_sample/2CSClientWPF_sample/app.config +++ b/root/programs/CS/Samples/2CS_sample/2CSClientWPF_sample/app.config @@ -78,7 +78,7 @@ - + diff --git a/root/programs/CS/Samples/2CS_sample/GenDaoAndBatUpd_sample/app.config b/root/programs/CS/Samples/2CS_sample/GenDaoAndBatUpd_sample/app.config index acc9767cd..f4679821e 100644 --- a/root/programs/CS/Samples/2CS_sample/GenDaoAndBatUpd_sample/app.config +++ b/root/programs/CS/Samples/2CS_sample/GenDaoAndBatUpd_sample/app.config @@ -66,7 +66,7 @@ - + diff --git a/root/programs/CS/Samples/2CS_sample/TimeStamp_sample/app.config b/root/programs/CS/Samples/2CS_sample/TimeStamp_sample/app.config index 9d60b5368..ad0044e42 100644 --- a/root/programs/CS/Samples/2CS_sample/TimeStamp_sample/app.config +++ b/root/programs/CS/Samples/2CS_sample/TimeStamp_sample/app.config @@ -59,7 +59,7 @@ - + diff --git a/root/programs/CS/Samples/Bat_sample/RerunnableBatch_sample/app.config b/root/programs/CS/Samples/Bat_sample/RerunnableBatch_sample/app.config index 42667924a..af4e70e78 100644 --- a/root/programs/CS/Samples/Bat_sample/RerunnableBatch_sample/app.config +++ b/root/programs/CS/Samples/Bat_sample/RerunnableBatch_sample/app.config @@ -79,7 +79,7 @@ - + diff --git a/root/programs/CS/Samples/Bat_sample/RerunnableBatch_sample2/app.config b/root/programs/CS/Samples/Bat_sample/RerunnableBatch_sample2/app.config index e75380c56..2426632a2 100644 --- a/root/programs/CS/Samples/Bat_sample/RerunnableBatch_sample2/app.config +++ b/root/programs/CS/Samples/Bat_sample/RerunnableBatch_sample2/app.config @@ -79,7 +79,7 @@ - + diff --git a/root/programs/CS/Samples/Bat_sample/RerunnableBatch_sample3/app.config b/root/programs/CS/Samples/Bat_sample/RerunnableBatch_sample3/app.config index 61de4a9da..8347685b1 100644 --- a/root/programs/CS/Samples/Bat_sample/RerunnableBatch_sample3/app.config +++ b/root/programs/CS/Samples/Bat_sample/RerunnableBatch_sample3/app.config @@ -79,7 +79,7 @@ - + diff --git a/root/programs/CS/Samples/Bat_sample/SimpleBatch_sample/app.config b/root/programs/CS/Samples/Bat_sample/SimpleBatch_sample/app.config index 1aadc4ed0..416a19f72 100644 --- a/root/programs/CS/Samples/Bat_sample/SimpleBatch_sample/app.config +++ b/root/programs/CS/Samples/Bat_sample/SimpleBatch_sample/app.config @@ -79,7 +79,7 @@ - + diff --git a/root/programs/CS/Samples/WS_sample/WSClient_sample/WSClientWPF_sample/app.config b/root/programs/CS/Samples/WS_sample/WSClient_sample/WSClientWPF_sample/app.config index b3752c57d..22f09fbd2 100644 --- a/root/programs/CS/Samples/WS_sample/WSClient_sample/WSClientWPF_sample/app.config +++ b/root/programs/CS/Samples/WS_sample/WSClient_sample/WSClientWPF_sample/app.config @@ -136,7 +136,7 @@ - + diff --git a/root/programs/CS/Samples/WebApp_sample/MVC_Sample/MVC_Sample/Web.config b/root/programs/CS/Samples/WebApp_sample/MVC_Sample/MVC_Sample/Web.config index 618f1e5d5..a6dc7d8c5 100644 --- a/root/programs/CS/Samples/WebApp_sample/MVC_Sample/MVC_Sample/Web.config +++ b/root/programs/CS/Samples/WebApp_sample/MVC_Sample/MVC_Sample/Web.config @@ -50,112 +50,33 @@ - - - - - - + + + "f53469c17c5a432f86ce563b7805ab89", + "b6b393fe861b430eb4ee061006826b03", + "f374a155909d486a9234693c34e94479" + ]'/> diff --git a/root/programs/VB/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/ASPNETWebService/packages.config b/root/programs/VB/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/packages.config similarity index 85% rename from root/programs/VB/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/ASPNETWebService/packages.config rename to root/programs/VB/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/packages.config index ca581fe46..2e0bfa983 100644 --- a/root/programs/VB/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/ASPNETWebService/packages.config +++ b/root/programs/VB/Frameworks/Infrastructure/ServiceInterface/ASPNETWebService/packages.config @@ -1,20 +1,15 @@  - + - - - - - - - + + @@ -43,12 +38,9 @@ - - - @@ -68,5 +60,5 @@ - + \ No newline at end of file diff --git a/root/programs/VB/Samples/2CS_sample/2CSClientWPF_sample/app.config b/root/programs/VB/Samples/2CS_sample/2CSClientWPF_sample/app.config index 450dcd458..9446e976b 100644 --- a/root/programs/VB/Samples/2CS_sample/2CSClientWPF_sample/app.config +++ b/root/programs/VB/Samples/2CS_sample/2CSClientWPF_sample/app.config @@ -73,7 +73,7 @@ - + diff --git a/root/programs/VB/Samples/2CS_sample/2CSClientWin_sample/app.config b/root/programs/VB/Samples/2CS_sample/2CSClientWin_sample/app.config index f670305b3..e42e97921 100644 --- a/root/programs/VB/Samples/2CS_sample/2CSClientWin_sample/app.config +++ b/root/programs/VB/Samples/2CS_sample/2CSClientWin_sample/app.config @@ -89,7 +89,7 @@ - + diff --git a/root/programs/VB/Samples/2CS_sample/GenDaoAndBatUpd_sample/app.config b/root/programs/VB/Samples/2CS_sample/GenDaoAndBatUpd_sample/app.config index 8d8accf35..4a2b44ca4 100644 --- a/root/programs/VB/Samples/2CS_sample/GenDaoAndBatUpd_sample/app.config +++ b/root/programs/VB/Samples/2CS_sample/GenDaoAndBatUpd_sample/app.config @@ -62,7 +62,7 @@ - + diff --git a/root/programs/VB/Samples/2CS_sample/TimeStamp_sample/app.config b/root/programs/VB/Samples/2CS_sample/TimeStamp_sample/app.config index 365aba1c1..c47aa3abf 100644 --- a/root/programs/VB/Samples/2CS_sample/TimeStamp_sample/app.config +++ b/root/programs/VB/Samples/2CS_sample/TimeStamp_sample/app.config @@ -55,7 +55,7 @@ - + diff --git a/root/programs/VB/Samples/Bat_sample/RerunnableBatch_sample/app.config b/root/programs/VB/Samples/Bat_sample/RerunnableBatch_sample/app.config index ee6fb3138..a6a363c07 100644 --- a/root/programs/VB/Samples/Bat_sample/RerunnableBatch_sample/app.config +++ b/root/programs/VB/Samples/Bat_sample/RerunnableBatch_sample/app.config @@ -80,7 +80,7 @@ - + diff --git a/root/programs/VB/Samples/Bat_sample/RerunnableBatch_sample2/app.config b/root/programs/VB/Samples/Bat_sample/RerunnableBatch_sample2/app.config index abc36ebdf..29442636e 100644 --- a/root/programs/VB/Samples/Bat_sample/RerunnableBatch_sample2/app.config +++ b/root/programs/VB/Samples/Bat_sample/RerunnableBatch_sample2/app.config @@ -80,7 +80,7 @@ - + diff --git a/root/programs/VB/Samples/Bat_sample/RerunnableBatch_sample3/app.config b/root/programs/VB/Samples/Bat_sample/RerunnableBatch_sample3/app.config index a7dd3284e..58b5b525b 100644 --- a/root/programs/VB/Samples/Bat_sample/RerunnableBatch_sample3/app.config +++ b/root/programs/VB/Samples/Bat_sample/RerunnableBatch_sample3/app.config @@ -80,7 +80,7 @@ - + diff --git a/root/programs/VB/Samples/Bat_sample/SimpleBatch_sample/app.config b/root/programs/VB/Samples/Bat_sample/SimpleBatch_sample/app.config index 1aadc4ed0..416a19f72 100644 --- a/root/programs/VB/Samples/Bat_sample/SimpleBatch_sample/app.config +++ b/root/programs/VB/Samples/Bat_sample/SimpleBatch_sample/app.config @@ -79,7 +79,7 @@ - + diff --git a/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWPF_sample/WSClientWPF_sample_all.sln b/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWPF_sample/WSClientWPF_sample_all.sln index c069ce9fa..d68e44a7a 100644 --- a/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWPF_sample/WSClientWPF_sample_all.sln +++ b/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWPF_sample/WSClientWPF_sample_all.sln @@ -5,7 +5,7 @@ VisualStudioVersion = 18.1.11312.151 MinimumVisualStudioVersion = 10.0.40219.1 Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "WSClientWPF_sample", "WSClientWPF_sample.vbproj", "{5B5899DA-98C9-47B7-8832-A21768D788B0}" EndProject -Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ASPNETWebService", "..\..\..\..\Frameworks\Infrastructure\ServiceInterface\ASPNETWebService\ASPNETWebService\ASPNETWebService.vbproj", "{CD8E53D2-B177-494B-AE08-1CEEF98E43D7}" +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ASPNETWebService", "..\..\..\..\Frameworks\Infrastructure\ServiceInterface\ASPNETWebService\ASPNETWebService.vbproj", "{CD8E53D2-B177-494B-AE08-1CEEF98E43D7}" EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "WCFService", "..\..\..\..\Frameworks\Infrastructure\ServiceInterface\WCFService\WCFService.vbproj", "{48114116-045D-4BB9-93FD-61306697F589}" EndProject diff --git a/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWPF_sample/app.config b/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWPF_sample/app.config index 42345f71e..c1f6d2d6f 100644 --- a/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWPF_sample/app.config +++ b/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWPF_sample/app.config @@ -112,7 +112,7 @@ - + @@ -138,7 +138,7 @@ - + diff --git a/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWin2_sample/app.config b/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWin2_sample/app.config index 7f9024809..4633f8e6f 100644 --- a/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWin2_sample/app.config +++ b/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWin2_sample/app.config @@ -43,7 +43,7 @@ - + diff --git a/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWin_sample/WSClientWin_sample.vbproj b/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWin_sample/WSClientWin_sample.vbproj index e8032f00f..2f7e1f004 100644 --- a/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWin_sample/WSClientWin_sample.vbproj +++ b/root/programs/VB/Samples/WS_sample/WSClient_sample/WSClientWin_sample/WSClientWin_sample.vbproj @@ -81,12 +81,6 @@ - - ..\..\Build\WSIFType_sample.dll - - - ..\..\Build\WSServer_sample.dll - @@ -178,6 +172,16 @@ 13.0.3 + + + {f6e2bd99-672a-4f69-82e3-eee5d9b639df} + WSIFType_sample + + + {15f78db3-7ab0-4adf-adca-48afbd54c31e} + WSServer_sample + + + + - + + +