コンパイラの警告 (レベル 3) C4398

'variable' : プロセスごとのグローバル オブジェクトは複数の appdomain と共に動作しない可能性があります。__declspec(appdomain) を使用することを考慮してください

解説

ネイティブ型の __clrcall 呼び出し規則を持つ仮想関数が原因で、アプリケーション ドメインごとの vtable が作成されます。 このような変数を複数のアプリケーション ドメインで使用すると、変数が正しく修正されない場合があります。

この警告は、変数 __declspec(appdomain) を明示的にマークすると解決できます。 Visual Studio 2017 より前のバージョンの Visual Studio では、/clr:pure を使用してコンパイルすると、グローバル変数が既定で appdomain 単位になり、この警告を解決できます。 /clr:pure コンパイラ オプションは Visual Studio 2015 では非推奨とされており、Visual Studio 2017 ではサポートされていません。

詳細については、「appdomain」および「アプリケーション ドメインと Visual C++」を参照してください。

次の例では C4398 が生成されます。

// C4398.cpp
// compile with: /clr /W3 /c
struct S {
   virtual void f( System::String ^ );   // String^ parameter makes function __clrcall
};

S glob_s;   // C4398
__declspec(appdomain) S glob_s2;   // OK