対象: root/programs/CS/Samples(.NET Framework 4.8 専用) / ブランチ: develop
最終更新: 2026-07-31
本書は コーディング・エージェントが本ディレクトリで作業する際の Context を目的とする。
フレームワーク本体の分析は ../Frameworks/ANALYSIS.md を、
.NET (Core) 版サンプルは ../Samples4NetCore/ANALYSIS.md を参照。
Open棟梁フレームワークの 使い方を示すサンプル兼テンプレート。
実務では「該当するサンプルをコピーして中身を書き換える」のが標準的な使い方であり、
コード中に // テスト用サンプルなので、必要に応じて流用 or 削除して下さい。 という
断り書きが全ファイルに入っている。つまり これらは「消して良い雛形」として書かれている。
同時に フレームワークの動作確認(テストベッド) も兼ねており、
特に WebForms_Sample は P層機能(画面遷移制御・二重送信検出・ダイアログ等)の網羅テストになっている。
全プロジェクトが net48(旧形式 csproj)。 SDK 形式は 1 つもない。
サンプルの設定ファイルは C:\root\files\resource\... という絶対パスを直書きしている。
<add key="FxXMLSPDefinition" value="C:\root\files\resource\XML\SPDefinition.xml" />
<add key="SqlTextFilePath" value="C:\root\files\resource\Sql" />root/Readme.ja.md の手順どおり、リポジトリの root 配下を C:\root\ に展開する必要がある。
本リポジトリのチェックアウト先が C:\OpenTouryo\root\ の場合、C:\root\files を別途用意しないと
実行時に定義ファイルが見つからず落ちる(ビルドは通る)。
補足: 分析時点のこの環境には
C:\root\files\が存在し、Log / MultiPurposeAuthSite / Sql / Test / X509 / Xmlが配置済み。
- SQL Server の Northwind データベースが既定(
app.configのConnectionString_SQL)。 Bat_sample/RerunnableBatch_sample*は追加でORDERS2テーブルが必要 (各readme.txt記載。CREATE ORDERS2.sqlを実行し、実行の都度DELETE FROM ORDERS2)。- SQL Server 以外は
C:\root\files\resource\Sql\[DBMS名]\TestTable.txtでテスト表を作成。 - 接続文字列は
localhost/sa/seigi@123等の サンプル値がリポジトリに直書きされている (公開 OSS のサンプル設定であり実資格情報ではない。流用時は必ず差し替える)。
全サンプルが Frameworks\Infrastructure\Build\ の DLL を HintPath で参照する。
<HintPath>..\..\..\Frameworks\Infrastructure\Build\OpenTouryo.Business.dll</HintPath>Build\ は 4_Build_CopyAssemblies.bat(Build_net48 → Build\ を xcopy)が作るディレクトリ。
したがって ビルド順は厳守:
2_Build_NuGet_net48.bat → Public / Framework / Public.Security / Dam*
3_Build_Business_net48.bat → Business
4_Build_CopyAssemblies.bat → Build_net48 を Build\ へコピー ★これを飛ばすと全滅
5〜10_Build_*_sample.bat → 各サンプル
CS/VB 合わせて 42 プロジェクトがこの Build\ を参照している。
| ディレクトリ | 種別 | 概要 |
|---|---|---|
2CS_sample/2CSClientWin_sample |
WinForms | 2層C/S の基本形。Splash → Login → Form1 |
2CS_sample/2CSClientWPF_sample |
WPF | 同上の WPF 版 |
2CS_sample/GenDaoAndBatUpd_sample |
WinForms | 自動生成Dao(DaoGen_Tool 出力)とバッチ更新の利用例 |
2CS_sample/TimeStamp_sample |
WinForms | タイムスタンプ(楽観排他)対応の自動生成Dao |
2CS_sample/CustCtrl_sample |
WinForms | カスタム コントロール(WinCustomTextBox 等)のデザインタイム プロパティ検証。Readme.txt が事実上の仕様書 |
2CS_sample/AsyncEvent_sample |
WinForms/WPF | 非同期イベント処理。test-winx2&wpfx2.bat で 4 プロセス起動 |
Bat_sample/SimpleBatch_sample |
コンソール | バッチの最小形。オンライン処理と同じ流儀 |
Bat_sample/RerunnableBatch_sample |
コンソール | リラン可能バッチ。通常のデータアクセス |
Bat_sample/RerunnableBatch_sample2 |
コンソール | SQLUtility + ExecGenerateSQL でラウンドトリップ削減 |
Bat_sample/RerunnableBatch_sample3 |
コンソール | SQLUtility で DataTable から Insert 文生成(静的SQLのみ) |
WS_sample/WSServer_sample |
Library | サービス側の B/D 層。ServiceInterface からレイトバインドされる |
WS_sample/WSIFType_sample |
Library | WS の I/F 型(引数・戻り値クラス)をサーバ/クライアント共有するためのアセンブリ |
WS_sample/WSClient_sample/* |
WinForms/WPF | 3層型クライアント。CallController 経由で B層を呼ぶ(4 種) |
WS_sample/ASPNETWebService |
— | README のみ。実体は別リポジトリ ResourceServerTemplates へ移動済み |
WebApp_sample/WebForms_Sample |
ASP.NET Web Forms | 最大のサンプル(.aspx 38 画面)。P層機能の網羅テスト |
WebApp_sample/MVC_Sample |
ASP.NET MVC5 | MVC5 + WebAPI 版 |
CLI_sample/* |
— | README のみ(3 件)。net48 版はドロップ済み(後述) |
CLI_sampleの実体は無い。Simple_CLIは Sharprompt が .NET Framework サポートを終了したため net48 版をドロップ。DAG_Login_CLI/LIR_Login_CLIはSystem.CommandLineの beta 解除待ちで移植保留。 → 実装は../Samples4NetCore/Legacy/CLI_sample/にのみ存在する。WS_sample/ASPNETWebServiceはOpenTouryoProject/ResourceServerTemplatesへ移動。
XXX_sample/
├─ Business/LayerB.cs … B層(MyFcBaseLogic 継承、UOC_ メソッド群)
├─ Common/TestParameterValue.cs … 引数クラス(MyParameterValue 継承)
├─ Common/TestReturnValue.cs … 戻り値クラス(MyReturnValue 継承)
├─ Dao/LayerD.cs … D層(MyBaseDao 継承、個別Dao)
├─ Dao/DaoShippers.cs … D層(DaoGen_Tool が生成した自動生成Dao)
├─ Program.cs / Form1.cs … P層(エントリポイント)
├─ MSGDefinition.xml … メッセージ定義
├─ SPDefinition.xml … 共有プロパティ定義
├─ SampleLogConf2CS.xml … log4net 設定
├─ app.config … 接続文字列 + appSettings
└─ readme.txt … 実行方法(コマンドライン引数など)
WS 系はこれに TMProtocolDefinition.xml / TMInProcessDefinition.xml が加わる。
Web 系は Logic/{Business,Common,Dao} または AppCode/sample/{Business,Common,Dao} に入る。
// P層
TestParameterValue p = new TestParameterValue(
screenId, controlId, "SelectCount", // ← methodName が UOC_ 振り分けキー
"SQL%individual%static%-", // ← ActionType(後述)
new MyUserInfo("", ""));
LayerB layerB = new LayerB();
TestReturnValue r = (TestReturnValue)layerB.DoBusinessLogic(p, DbEnum.IsolationLevelEnum.ReadCommitted);
if (r.ErrorFlag) { /* 業務例外:ErrorMessageID / ErrorMessage / ErrorInfo */ }
else { /* 正常系:r.Obj など */ }CallController cc = new CallController(context);
object ret = cc.Invoke("testInProcess", parameterValue); // 論理名で解決論理名 → プロトコル は TMProtocolDefinition.xml、
論理名 → assembly/class は TMInProcessDefinition.xml で解決される。
WSClientWPF_sample/TMProtocolDefinition.xml の実例:
| id | protocol | 意味 |
|---|---|---|
testInProcess |
1 | インプロセス |
testWebService |
2 | ASP.NET Web サービス (asmx) ※コメントアウト |
testWebService2 |
3 | WCF-HTTP ※コメントアウト |
testWebService3 |
4 | WCF-TCP (net.tcp://localhost:7777/...) |
testWebService4 |
5 | ASP.NET WebAPI (JSON-RPC) |
_ 始まりの id(_testWebService 等)は url_ref / prop_ref でマスタ データを参照する記法の例。
% 区切りの 4 要素。フレームワークが解釈するのは [0] のみで、[1] 以降はサンプル独自。
| 位置 | 意味 | 値 |
|---|---|---|
[0] |
データ プロバイダ選択(フレームワークが解釈) | SQL OLE ODB ODP MCN NPS DB2 HIR |
[1] |
Dao の種類(サンプル独自) | common(CmnDao) / generate(自動生成Dao) / それ以外(個別 LayerD) |
[2] |
SQL の種類(サンプル独自) | static(.sql) / dynamic(.xml = DPQ) |
[3] |
ロールバック試験(サンプル独自) | Business(業務例外) / System(システム例外) / -(正常) |
バッチのコマンドライン例(SimpleBatch_sample/readme.txt):
/Dap SQL /Mode1 individual /Mode2 static /EXROLLBACK -
StringVariableOperator.GetCommandArgs('/', out argsDic, out valsLst) で分解し、
キーは大文字化されて argsDic["/DAP"] のように引かれる点に注意。
appSettings に Fx* キー、connectionStrings に ConnectionString_{SQL,OLE,ODBC,ODP,MCN}。
<runtime><assemblyBinding> に 大量の bindingRedirect が入っている(net48 の宿命)。
NuGet パッケージを更新すると、ここも追随が必要。
WebForms_Sample は <appSettings file="app.config" /> で appSettings を外部ファイルに分離している。
Fx* キーの実体は app.config 側にあるので、設定を探すときは Web.config ではなく app.config を見る。
P層(Web Forms)専用の設定群:
| 種別 | キー |
|---|---|
| コントロール接頭辞 | FxPrefixOfButton=btn, FxPrefixOfTextBox=txt, FxPrefixOfGridView=gvw … 全 13 種 |
| 基盤画面パス | FxErrorScreenPath FxOKMessageDialogPath FxYesNoMessageDialogPath FxDialogFramePath |
| アイコン | FxInformationIconPath FxWarningIconPath FxErrorIconPath FxQuestionIconPath |
| ダイアログ既定スタイル | FxDefaultFxDialogStyle FxDefaultBusinessDialogStyle FxDefaultNormalScreenStyle |
| 画面制御 | FxSessionTimeOutCheck FxDoubleTransmissionCheck FxScreenTransitionMode FxScreenTransitionCheck |
| キュー長 | FxRequestTicketGuidMaxQueueLength FxButtonhistoryMaxQueueLength FxScreeenGuidMaxQueueLength FxWindowGuidMaxQueueLength |
| XML 定義 | FxXMLSPDefinition FxXMLMSGDefinition FxXMLSCDefinition FxXMLTCDefinition FxXMLTMProtocolDefinition FxXMLTMInProcessDefinition |
_3TierEngine 命名規約 |
DaoClassNameHeader=Dao, MethodNameHeaderS=S, MethodNameHeaderD=D, MethodLabel_Ins=1_Insert … UpdateParamHeader=Set_, LikeParamFooter=_Like |
_3TierEngine の命名規約キーは自動生成Daoのメソッド名(S1_Insert / D2_Select / D5_SelCnt)と直結しており、
片方だけ変えると実行時に解決できなくなる。
MyBaseDao.SetSqlByFile2 は内部で GetConfigValue("sqlTextFilePath")(小文字 s)を引くが、
app.config の定義は SqlTextFilePath(大文字 S)。
.NET Framework の appSettings も Microsoft.Extensions.Configuration もキー比較は大文字小文字を無視するため
動作するが、意図的な一致ではないので、このキー名を「揃える」目的で書き換えないこと。
root/programs/CS/ 直下の bat(z_Common.bat が MSBuild を解決)。
| bat | 対象 |
|---|---|
5_Build_2CS_sample.bat |
2CS_sample/* |
5_Build_Bat_sample.bat |
Bat_sample/*(4 sln を順次) |
5_Build_CLI_sample.bat |
CLI_sample(実体が無いので実質 no-op) |
6_Build_WSSrv_sample.bat |
WSServer_sample → WS_sample/Temp → WS_sample/Build へ xcopy |
7_Build_Framework_WS.bat |
ServiceInterface。WS_sample/Build を WCFService/dll へコピーしてからビルド |
8_Build_WSClnt_sample.bat |
WSClient_sample/*(4 sln) |
10_Build_WebApp_sample.bat |
WebForms_Sample → MVC_Sample |
WS_sample/Build/ は成果物置き場であり、7_Build_Framework_WS.bat が
ServiceInterface/WCFService/dll/ へ流し込む中継点になっている(.gitignore 済み)。
Web 系は packages.config 方式(NuGet classic)なので、nuget.exe restore が必須
(各 bat が ..\nuget.exe restore を実行している)。
- バッチ: プロジェクトのプロパティ → デバッグ → コマンドライン引数に
readme.txtの文字列を設定。 AsyncEvent_sample: sln をビルド後test-winx2&wpfx2.batから 4 プロセス起動。WebForms_Sample:sessionState mode="StateServer"既定 → ASP.NET 状態サービスの起動が必要 (C:\root\files\bat\aspnet_state-stat.bat)。- WS クライアント: 先に
WSServer_sampleとServiceInterface(WCF/WebAPI ホスト)を起動。
B層(LayerB.UOC_SelectCount 等)が CmnDao / 自動生成Dao / 個別Dao の 3 経路を
switch で切り替える形になっており、Open棟梁のデータアクセス手段が 1 ファイルで俯瞰できる。
switch ((testParameter.ActionType.Split('%'))[1])
{
case "common": CmnDao cmnDao = new CmnDao(this.GetDam());
cmnDao.SQLFileName = "ShipperCount.sql"; // or .xml (DPQ)
testReturn.Obj = cmnDao.ExecSelectScalar(); break;
case "generate": DaoShippers genDao = new DaoShippers(this.GetDam());
testReturn.Obj = genDao.D5_SelCnt(); break;
default: LayerD myDao = new LayerD(this.GetDam());
myDao.SelectCount(testParameter, testReturn); break;
}**日本語のメソッド名「テンプレ」**が各サンプルの LayerD に入っており、
SetSqlByFile2 / SetSqlByCommand / SetParameter / ExecXxx の全パターンが
コメント付きで並んでいる。D層を書くときのチートシートとして機能する。
実運用コードにコピーする際は削除する前提。
ヘッダに 作成者:棟梁 D層自動生成ツール(墨壺) と入る。メソッド命名は
S1_Insert D1_Insert S2_Select D2_Select S3_Update D3_Update S4_Delete D4_Delete D5_SelCnt
(S=静的SQL、D=動的SQL(DPQ)、番号は MethodLabel_* 設定に対応)。
手で編集せず、ツールで再生成するのが本来の運用。
Aspx/ 配下の内訳:
| ディレクトリ | .aspx 数 | 内容 |
|---|---|---|
testFxLayerP/ |
19 | P層機能の網羅テスト(最重要) |
testScreenCtrl/ |
6 | 画面遷移制御 |
sample/ |
5 | 業務サンプル |
start/ |
3 | ログイン・メニュー |
Framework/ |
3 | ダイアログ等の基盤画面 |
OAuth2/ |
1 | OAuth2 連携 |
Common/ |
1 | エラー画面 |
AppCode/testPublic/Business/TestMTC*.cs はマルチ トランザクション制御の検証コード。
Aspx/Common/Master/testNest/ にはマスタ ページ多重ネストの検証が入っている。
| 手法 | 動的SQL | |
|---|---|---|
| 無印 | 通常のデータアクセス(S1_Insert / D1_Insert を切替) |
可 |
2 |
SQLUtility + ExecGenerateSQL でラウンドトリップ削減 |
可 |
3 |
SQLUtility で DataTable から Insert 文を生成 |
不可(静的のみ) |
4_Build_CopyAssemblies.batを飛ばすと全サンプルがビルドできない。Build\(Build_net48のコピー)をHintPath参照しているため。C:\root\files\...の絶対パス依存。 チェックアウト先がC:\root以外だと実行時に落ちる。 IDE から F5 する前にC:\root\filesの存在を確認すること。net48のみ。 .NET (Core) 版は../Samples4NetCore/Legacy/にある別コピー。 B層・D層のソースはほぼ同一だが独立管理(4-2 参照)→ 片方を直したらもう片方も直す。ReturnValueを設定し忘れると戻り値が null。UOC_メソッドの冒頭で必ずthis.ReturnValue = testReturn;する(フレームワーク側の仕様。../Frameworks/ANALYSIS.md3.2 節)。app.configのbindingRedirectが大量。NuGet 更新時は追随が必要。WebForms_Sample/MVC_Sampleはpackages.config方式。PackageReference移行はされていない。nuget.exe restoreを忘れるとビルドが落ちる。CLI_sampleにコードは無い(README のみ)。実装を探すなら../Samples4NetCore/Legacy/CLI_sample/。WS_sample/Build/WS_sample/Temp/はビルド生成物。コミット対象ではない(Build/は.gitignore済み)。_3TierEngineの命名規約キーと自動生成Daoのメソッド名は連動。片方だけ変えない(7-2 参照)。- VB 版ミラーが存在(
root/programs/VB/Samples/)。構成はほぼ 1:1 対応。
Samples4NetCore/Legacy/ は Samples/ を .NET (Core) 向けに移植した独立コピー。
Compile Include によるファイル共有はしていない(リンク参照ゼロ)。
実測した差分:
| サンプル群 | 同一ファイル | 差異あり | Samples 側のみ |
|---|---|---|---|
2CS_sample |
138 | 18 | 26 |
Bat_sample |
73 | 14 | 8 |
WS_sample |
65 | 14 | 36 |
Business/LayerB.csやDao/*.csは多くがバイト単位で同一。- 差異があるのは主に
*.csproj/*.sln/Program.cs(Core 側はGetConfigParameter.InitConfiguration()呼び出しが増える)。 Samples側のみ =app.config(Core はappsettings.json)、Properties/AssemblyInfo.cs(SDK 形式では自動生成)、 および未移植のAsyncEvent_sample/WSClientWinCone_sample。
→ B層・D層のロジックを修正したら、Samples4NetCore/Legacy/ 側の同名ファイルも同じ修正が必要。
-
AGENTS.mdのポリシー遵守(git 操作をしない) - 変更が
Samples4NetCore/Legacy/側にも必要か判定(11 節) -
Frameworksを先にビルド →4_Build_CopyAssemblies.batを実行(Build\を作る) - Web 系を触るなら
nuget.exe restore(packages.config方式) - 新規 .cs にはヘッダ コメント(Apache License / クラス名・日本語名・更新履歴)を付与、既存変更時は履歴に 1 行追記。
Copyright ブロックは新規には付けない(
../Frameworks/ANALYSIS.md8.1 節) -
UOC_メソッドの冒頭でthis.ReturnValue = ...を設定 -
ActionTypeの%区切り規約を壊さない(6 節) - 設定キーを増やしたら
app.config(Web はapp.config側)に追記 - 実行確認をするなら
C:\root\filesと Northwind DB の準備状況を先に確認