MS_VSSolutionStructure - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

VS゜リュヌション プロゞェクトの構成怜蚎

抂芁

Visual Studio の、「゜リュヌション」・「プロゞェクト」の構成を怜蚎する際の
ポむントに぀いお説明する。

゜リュヌション・プロゞェクト

Visual Studio では、開発するプログラムを、
゜リュヌション・プロゞェクトずいう単䜍で管理する。

  • ぀のプログラムは、耇数のアセンブリEXE や DLL ファむルから
    構成される堎合がある。

  • ぀の Web サむト・Web アプリケヌションも、
    耇数のアセンブリやコンテンツ ファむルから構成される。

  • たた、各アセンブリをコンピュヌタにむンストヌルするための
    「セットアップ プログラム」・「Web セットアップ プログラム」などがある。

補足3 ぀の単䜍の察応関係: 混乱しやすいので先に敎理する。

゜リュヌション*.sln      
 1 ぀以䞊のプロゞェクトを束ねる「䜜業単䜍」
  └ プロゞェクト*.csproj 
 1 ぀のアセンブリを䜜る「ビルド単䜍」
       └ アセンブリ*.dll 
 1 ぀の「配眮・バヌゞョン管理単䜍」

原則 1 プロゞェクト = 1 アセンブリであり、
゜リュヌションはビルドはするが、成果物そのものではない。
.NETアセンブリ も䜵せお参照。

プロゞェクト

  • プロゞェクトのビルドに関する構成情報を保持しおいる。
  • ぀のアセンブリを䜜成するには、぀の「プロゞェクト」が必芁になる。
  • ぀の基本的なプロゞェクトは぀のアセンブリを出力するEXE、DLL。

プロゞェクト ファむル

  • *.csprojC# 甚、*.vbprojVB 甚などの拡匵子を持぀。

  • Windows アプリケヌションの VB プロゞェクトのプロパティの䟋

    • アプリケヌション

      • アセンブリ名
      • 名前空間
      • アプリケヌションの皮類
      • アむコン
      • スタヌトアップ フォヌム
      • フレヌムワヌク
      • プロパティ
      • ,etc.
    • コンパむル

      • ビルド出力パス
      • 詳现コンパむル オプション
      • Option Explicit,Strict,Compare
      • 譊告・゚ラヌの衚瀺
      • ,etc.
    • デバッグ
      デバッグ時の動䜜の蚭定をする。

      • スタヌトアップ
      • コマンドラむン匕数
      • ,etc.
    • 参照
      アセンブリや COM コンポヌネントなど、
      プロゞェクトで䜿甚するコンポヌネントの参照蚭定を蚭定する。

    • リ゜ヌス
      プロゞェクトのリ゜ヌスを蚭定する。

      • 文字列
      • むメヌゞ
      • アむコン
      • オヌディオ
      • ファむル
      • ,etc.
    • 蚭定
      app.config のナヌザ セッティング情報を蚭定する。

    • 眲名
      アセンブリに厳密名などのアセンブリ眲名をしたりする。

    • セキュリティ、発行
      ClickOnce アプリケヌションで䜿甚する蚭定をする。

補足: これらの蚭定は、いずれも MSBuild の
プロパティずしお .csproj に曞かれる。
GUI はその線集画面に過ぎない。
SDK 圢匏のプロゞェクトでは .csproj が非垞に短くなったため、
盎接線集する方が速い堎面も倚い。

分割の意味

  • モゞュヌル単䜍の倉曎
  • 配垃単䜍の倉曎アセンブリでの配垃

゜リュヌション

  • 党䜓のビルドに関する構成情報を保持しおいる。

  • 耇数のアセンブリから構成されるアプリケヌションを䜜成できる。

  • このような構成を行う堎合、以䞋の通りの方法がある。

    • 耇数のアセンブリをプロゞェクトでたずめるバむナリ参照。
    • 耇数のプロゞェクトを゜リュヌションでたずめるプロゞェクト参照。

゜リュヌション ファむル

  • *.sln の拡匵子を持぀。

  • ゜リュヌションのプロパティの䟋

補足最新化: .NET SDK 10 以降では、
*.slnx ずいう新しい XML 圢匏の゜リュヌション ファむルが導入された。
埓来の .sln は独自圢匏で GUID が倚く、
マヌゞ コンフリクトが起きやすいずいう問題があったが、
.slnx はプロゞェクトのパスを列挙するだけの玠盎な XML になっおいる。

<Solution>
  <Project Path="src/App/App.csproj" />
  <Project Path="src/Lib/Lib.csproj" />
</Solution>

分割の意味

  • ビルド単䜍の倉曎
  • 配垃単䜍の倉曎MSI での配垃

分割のメリット・デメリット

䞀般的に小芏暡開発の堎合は分割を少なくしお、倧芏暡開発の堎合に分割を怜蚎する。

トレヌドオフ

メリット

  • 管理が容易になる。

  • 開発䜜業の分担が可胜になる。

  • 郚品化等により差し替えが容易になる。

  • 修正箇所毎、ビルド範囲を絞る事ができる。

  • アセンブリや MSI での配垃が容易。

  • プロセス、アプリケヌション ドメむン分割により、
    障害範囲を少なくできる。

デメリット

  • 管理が煩雑になる。

  • 開発䜜業の分担ができなくなる。

  • 郚品化等により差し替えができなくなる。

  • 修正箇所毎、ビルド範囲を絞る事ができなくなる。

  • 耇数のアセンブリや MSI を
    組み合わせた配垃が必芁になる。

  • プロセス、アプリケヌション ドメむン分割により、
    プロセス間通信が必芁になる。

補足この衚の読み方: メリットずデメリットが
同じ項目の裏返しになっおいる点が芁点である。
原文は「分割しない堎合のデメリット」を䞊べおいるのではなく、
分割しすぎた堎合のデメリットを䞊べおいるず読むのが正しい。

分割しない ◀──────────────────▶ 分割しすぎ
 ・ビルドが遅い                    ・管理が煩雑
 ・差し替えできない                ・参照関係が远えない
 ・分担しにくい                    ・ビルド順序が耇雑

補足実務䞊の目安: 珟圚の䞀般的な指針は
**「プロゞェクトは少ないほど良い」**である。

  • プロゞェクト数はビルド時間に盎結する1 プロゞェクト = 1 コンパむル
  • アセンブリ境界は実行時のコストでもある型のロヌド、JIT
  • 「レむダごずにプロゞェクトを分ける」だけでは蚭蚈䞊の意味が薄い
    フォルダず internal で足りるこずが倚い

分けるべき明確な理由があるずきにだけ分ける、ずいうのが原則。

分ける理由 䟋
別々に配垃する NuGet パッケヌゞにする、他システムぞ提䟛する
参照の向きを匷制したい ドメむン局がむンフラ局を参照しないこずを保蚌する
タヌゲットが違う 䞀方は netstandard2.0、他方は net8.0
テストプロゞェクト 本䜓ず䞀緒に配垃しない

補足最新化: アプリケヌション ドメむンは
.NET Core 以降存圚しない
䜜成できない。
以䞋は .NET Framework  IIS 前提の話である。

.NET Framework .NETCore 系
分離の単䜍 AppDomain1 プロセス内で耇数 プロセス
アセンブリのアンロヌド AppDomain 単䜍で可胜 AssemblyLoadContext で可胜
Web の分離 IIS のアプリケヌション プヌル  AppDomain プロセスKestrel単䜍

ASP.NET Core では 1 アプリ = 1 プロセスが基本であり、
分離はコンテナやアプリケヌション プヌルの粒床で考えるこずになる。

異なるアプリケヌション ドメむンに画面遷移する方法

  • Server.Transfer は䞍可胜。
  • Response.Redirect, Link などの Get メ゜ッドは可胜。
  • クロスペヌゞ ポストバックなどの POST メ゜ッドは可胜。

異なるアプリケヌション ドメむンず情報共有する方法

以䞋の状態管理技術は、異なるアプリケヌション ドメむンず情報共有できない。

  • Application オブゞェクト

  • 静的倉数

  • Cache オブゞェクト

  • Session オブゞェクト

  • その他

    • ViewState は同䞀 WebForm 画面内でのみ有甚。
    • HttpContext は、Server.Transfer 画面遷移の間で有甚

以䞋の状態管理技術は、異なるアプリケヌション ドメむンず情報共有できる。

  • QueryString
  • Cookie
  • Hidden
  • Cookie 認蚌チケット
    ASP.NET2.0 から ASP.NET の Forms 認蚌の認蚌チケットを
    • 耇数のサむト間で共有する仕組みが甚意され、
    • 耇数のサむト間で利甚できるようになった。

各状態管理技術に぀いおは、コチラを参照。

補足この分類の本質: 共有できるものずできないものの違いは、
どこに状態が眮かれおいるかで決たる。

【共有できない】サヌバのメモリプロセス内に眮く
   Application / 静的倉数 / Cache / SessionInProc

【共有できる】クラむアントが持ち運ぶ
   QueryString / Cookie / Hidden / 認蚌チケット

したがっお Session も「倖に出せば」共有できる。
SQL Server セッション ステヌト、Redis分散キャッシュを
䜿えばプロセスをたたげる。
これは .NET CoreのDockerコンテナ化 で述べた
「コンテナは耇数むンスタンスに増えるので状態を倖出しする」
ずいう話ずたったく同じ構図である。

参照蚭定の遞択

プロゞェクト参照

  • プロゞェクトに察しお参照蚭定を行う。

  • ビルド順も自動的に管理され、バヌゞョンの䞍䞀臎などが起こり難く䜿い易い。

  • 参照先のプロゞェクトの倉曎・差し替えが容易なので、
    FIX しおいないモゞュヌルに察しおはプロゞェクト参照を䜿甚する。

バむナリ参照

  • アセンブリに察しお参照蚭定を行う。

  • 参照先のバむナリの倉曎・差し替えが面倒なので、
    FIX したモゞュヌルに察しおはバむナリ参照を䜿甚する。

補足珟圚は 3 ぀目の遞択肢がある: 「FIX したかどうか」で
䜿い分けるずいう原文の敎理は劥圓だが、
珟圚は NuGet の PackageReference が
バむナリ参照の䞊䜍互換ずしお䜿える。

方匏 向く堎面 䟝存の解決
プロゞェクト参照 同じ゜リュヌション内。同時に開発する ビルド順が自動
バむナリ参照HintPath 手元の DLL を盎接指す 手動掚移的䟝存も自分で
PackageReference 別リリヌス サむクルの共通郚品 自動掚移的䟝存も解決

バむナリ参照は掚移的䟝存を自分で管理する必芁があるため、
珟圚は NuGet 化するのが玠盎である
瀟内なら NuGet プラむベヌト・リポゞトリ。

Web アプリケヌション、Web サむト

関係

 Web アプリ・サむト ≒  IIS アプリ

  • ぀の Web アプリケヌション・Web サむトは、
    ぀の IIS のアプリケヌションず察応する。
  • 耇数の Web アプリケヌション・Web サむトを
    ぀の IIS のアプリケヌションに纏めるこずはできない。

耇数プロゞェクトから Web アプリ・サむトを構成する方法

぀の Web アプリケヌション・Web サむトを耇数プロゞェクトにたずめる方法

裏ワザ的な方法だず思いたすが・・・、

  • マむクロ゜フト サポヌト オンラむン
    チヌム開発甚に耇数のプロゞェクトから ASP.NET アプリケヌションを䜜成する方法
    http://support.microsoft.com/default.aspx?scid=kb;ja;JP307467

補足最新化: ASP.NET Core では
Razor クラス ラむブラリ (RCL) により、
View やペヌゞ、静的ファむルを別プロゞェクトに眮いお合成できる。
原文が「裏ワザ的」ずしおいた構成が、暙準機胜になった。

WebApp.csproj      
 ホスト
  └ 参照 Feature.A.csprojRCL  Views / wwwroot を含む
  └ 参照 Feature.B.csprojRCL

Web アプリ・サむト間で SessionCookie、Cookie 認蚌 Ticket を共有する方法ASP.NET

䞊蚘のようにサむトを纏めなくおも、SessionCookie、Cookie 認蚌 Ticket が共有できれば。

配眮

  • Web サむトを本番環境に配眮する方法には、

    • ファむル・フォルダのコピヌ
    • プリコンパむル埌のファむル・フォルダのコピヌ
    • セットアップ プログラムによるむンストヌル

    などがある。

  • Web アプリケヌションを本番環境に配眮する方法には、

    • 発行、Web Deploy
    • セットアップ プログラムによるむンストヌル

    などがある。

ファむル・フォルダのコピヌ

  • アセンブリが生成されおいない状態でアプリケヌションを配垃した際の
    初期芁求時に JIT コンパむルが実行される。
  • JIT コンパむルによりアセンブリが生成され、その埌にアプリケヌションが実行される。
  • JIT コンパむルにより生成されたアセンブリは、
    %windir%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files で確認できる。

プリコンパむル埌のファむル・フォルダのコピヌ

  • 事前コンパむルによりアセンブリを生成しおおくこずで
    初期芁求時の JIT コンパむルを䞍芁にできる。
  • この堎合、Web サむトのファむル システム䞊にアセンブリが生成される。
  • プリコンパむルにより生成されたアセンブリは、
    生成された Web サむトのフォルダの盎䞋にある「bin」フォルダで確認できる。

補足Web サむトず Web アプリケヌションの違い: この節が
2 ぀を分けお説明しおいるのは、プロゞェクトの皮類が違うためである。

Web サむト Web アプリケヌション
プロゞェクト ファむル 無いフォルダがそのたたプロゞェクト ある.csproj
コンパむル 実行時初回芁求時に JIT ビルド時1 ぀の DLL に
配眮 ゜ヌス.aspx.csごずコピヌ bin の DLL  .aspx

Web サむト圢匏は゜ヌス コヌドが本番に眮かれるため、
セキュリティ・性胜の䞡面で珟圚は䜿われない。
詳现は ASP.NETの構成Webサむト・Webアプリを参照。

セットアップ プログラムによるむンストヌル

Web セットアップ プログラムによる Web サむトのむンストヌルが可胜。

ASP.NET の配眮発行


Tags: 移行, .NET開発

⚠ **GitHub.com Fallback** ⚠