コンパイラの警告 (レベル 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