Compiler Warning (level 3) C4398

'variable' : per-process global object might not work correctly with multiple appdomains; consider using __declspec(appdomain)

Remarks

A virtual function with __clrcall calling convention in a native type causes the creation of a per application domain vtable. Such a variable may not correct correctly when used in multiple application domains.

You can resolve this warning by explicitly marking the variable __declspec(appdomain). In versions of Visual Studio before Visual Studio 2017, you can resolve this warning by compiling with /clr:pure, which makes global variables per appdomain by default. The /clr:pure compiler option is deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017.

For more information, see appdomain and Application Domains and Visual C++.

Example

The following sample generates 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