/clr:pure の利点
パフォーマンスの向上: 純粋なアセンブリには MSIL のみが含まれているため、ネイティブ関数はなく、マネージ/アンマネージ遷移は必要ありません。(P/Invoke による関数呼び出しは、この規則の例外です。)
AppDomain の認識: マネージ関数と CLR データ型はアプリケーション ドメイン内に存在し、それらの可視性とアクセシビリティに影響します。純粋なアセンブリはドメインに対応しているため (型ごとに __declspec(appdomain) が暗示されます)、他の .NET コンポーネントからその型や機能にアクセスするのがより簡単かつ安全になります。その結果、純粋なアセンブリは、混合アセンブリよりも他の .NET コンポーネントと簡単に相互運用できます。
非ディスク読み込み: 純粋なアセンブリをメモリ内に読み込み、ストリーミングすることもできます。これは、.NET アセンブリをストアド プロシージャとして使用する場合に不可欠です。これは、Windows の読み込みメカニズムに依存するため、実行するためにディスク上に存在する必要がある混合アセンブリとは異なります。
リフレクション: 混合実行可能ファイルをリフレクションすることはできませんが、純粋なアセンブリは完全なリフレクション サポートを提供します。詳細については、リフレクション (C++/CLI) を参照してください。
ホストの制御性: 純粋なアセンブリには MSIL のみが含まれているため、CLR をホストし、その既定の動作を変更するアプリケーションで使用すると、混合アセンブリよりも予測可能かつ柔軟に動作します。
/clr:pure の制限事項
このセクションでは、/clr:pure で現在サポートされていない機能について説明します。
純粋なアセンブリは、アンマネージ関数から呼び出すことはできません。したがって、純粋なアセンブリは、COM インターフェイスを実装したり、ネイティブ コールバックを公開したりすることはできません。純粋なアセンブリは、__declspec(dllexport) または .DEF ファイルを介して関数をエクスポートできません。また、__clrcall 規則で宣言された関数は、__declspec(dllimport) を介してインポートできません。ネイティブ モジュール内の関数は純粋なアセンブリから呼び出すことができますが、純粋なアセンブリはネイティブ呼び出し可能な関数を公開できないため、純粋なアセンブリ内の機能を公開するには、混合アセンブリ内のマネージド関数を使用して行う必要があります。詳細については、「方法: /clr:pure (C++/CLI) に移行する」を参照してください。
ATL および MFC ライブラリは、Visual C++ のピュア モード コンパイルではサポートされていません。
純粋な .netmodules は、Visual C++ リンカへの入力として受け入れられません。ただし、純粋な .obj ファイルはリンカーによって受け入れられ、.obj ファイルには netmodules に含まれる情報のスーパーセットが含まれます。詳細については、リンカー入力としての .netmodule ファイルを参照してください。
コンパイラ COM サポート (#import) はサポートされていません。純粋なアセンブリにアンマネージ命令が導入されるためです。
アラインメントと例外処理の浮動小数点オプションは、純粋なアセンブリでは調整できません。そのため、__declspec(align) は使用できません。これにより、fpieee.h などの一部のヘッダー ファイルが /clr:pure と互換性がなくなります。
PSDK の GetLastError 関数は、/clr:pure を使用してコンパイルすると、未定義の動作を引き起こす可能性があります。