title: C++/CLI, DllExport and /clr:pure
body: <p>Here is a simple native DLL:</p>
  
  <p><em>Native.h</em>:</p>
  
  <pre><code>#ifdef BUILDING_NATIVE_DLL
  #define DLLAPI __declspec(dllexport)
  #else
  #define DLLAPI __declspec(dllimport)
  #endif
  
  class DLLAPI Native
  {
      public: void f();
  };
  </code></pre>
  
  <p><em>Native.cpp</em>:</p>
  
  <pre><code>#include "Native.h"
  
  void Native::f()
  {
  }
  </code></pre>
  
  <p>Build:</p>
  
  <pre><code>cl /DBUILDING_NATIVE_DLL /LD Native.cpp
  ...
      Creating library Native.lib and object Native.exp
  </code></pre>
  
  <p>Now I'd like to use it from a <strong>C++/CLI</strong> application:</p>
  
  <p><em>Managed.cpp</em>:</p>
  
  <pre><code>#include "Native.h"
  
  int main()
  {
      Native* native = new Native();
      native-&gt;f();
  }
  </code></pre>
  
  <p>I can build it in <strong>CLR mode "IJW"</strong>:</p>
  
  <pre><code>cl /clr Managed.cpp Native.lib
  ...
  
  /out:Managed.exe
  Managed.obj
  Native.lib
  </code></pre>
  
  <p>But not in <strong>CLR mode "pure"</strong>:</p>
  
  <pre><code>cl /clr:pure Managed.cpp Native.lib
  Microsoft (R) C/C++ Optimizing Compiler Version 16.00.40219.01
  for Microsoft (R) .NET Framework version 4.00.30319.18047
  Copyright (C) Microsoft Corporation.  All rights reserved.
  
  Managed.cpp
  c:\users\...\Native.h(9) : warning C42
  72: 'Native::f' : is marked __declspec(dllimport); must specify native calling c
  onvention when importing a function.
  c:\users\...\Native.h(10) : warning C4
  272: 'Native::Native' : is marked __declspec(dllimport); must specify native cal
  ling convention when importing a function.
  c:\users\...\Native.h(10) : warning C4
  272: 'Native::~Native' : is marked __declspec(dllimport); must specify native ca
  lling convention when importing a function.
  c:\users\...\Native.h(10) : warning C4
  272: 'Native::Native' : is marked __declspec(dllimport); must specify native cal
  ling convention when importing a function.
  c:\users\...\Native.h(10) : warning C4
  272: 'Native::operator =' : is marked __declspec(dllimport); must specify native
   calling convention when importing a function.
  Microsoft (R) Incremental Linker Version 10.00.40219.01
  Copyright (C) Microsoft Corporation.  All rights reserved.
  
  /out:Managed.exe
  /clrimagetype:pure
  Managed.obj
  Native.lib
  Managed.obj : error LNK2028: unresolved token (0A000009) "public: void __clrcall
   Native::f(void)" (?f@Native@@$$FQAMXXZ) referenced in function "int __clrcall m
  ain(void)" (?main@@$$HYMHXZ)
  Managed.obj : error LNK2019: unresolved external symbol "public: void __clrcall
  Native::f(void)" (?f@Native@@$$FQAMXXZ) referenced in function "int __clrcall ma
  in(void)" (?main@@$$HYMHXZ)
  Managed.exe : fatal error LNK1120: 2 unresolved externals
  </code></pre>
  
  <p>So what seems to break the build is the lack of the native <strong>calling convention</strong>.</p>
  
  <p>And indeed if I specify it:</p>
  
  <pre><code>#ifdef BUILDING_NATIVE_DLL
  #define DLLAPI __declspec(dllexport)
  #else
  #define DLLAPI __declspec(dllimport)
  #endif
  
  class DLLAPI Native
  {
      public: void __thiscall f();
  };
  </code></pre>
  
  <p>it's better:</p>
  
  <pre><code>cl /clr:pure Managed.cpp
  Native.lib
  Microsoft (R) C/C++ Optimizing Compiler Version 16.00.40219.01
  for Microsoft (R) .NET Framework version 4.00.30319.18047
  Copyright (C) Microsoft Corporation.  All rights reserved.
  
  Managed.cpp
  c:\users\...\Native.h(10) : warning C4
  272: 'Native::Native' : is marked __declspec(dllimport); must specify native cal
  ling convention when importing a function.
  c:\users\...\Native.h(10) : warning C4
  272: 'Native::~Native' : is marked __declspec(dllimport); must specify native ca
  lling convention when importing a function.
  c:\users\...\Native.h(10) : warning C4
  272: 'Native::Native' : is marked __declspec(dllimport); must specify native cal
  ling convention when importing a function.
  c:\users\...\Native.h(10) : warning C4
  272: 'Native::operator =' : is marked __declspec(dllimport); must specify native
   calling convention when importing a function.
  Microsoft (R) Incremental Linker Version 10.00.40219.01
  Copyright (C) Microsoft Corporation.  All rights reserved.
  
  /out:Managed.exe
  /clrimagetype:pure
  Managed.obj
  Native.lib
  </code></pre>
  
  <p>But still warnings on generated members.</p>
  
  <p>So here are the questions:</p>
  
  <ul>
  <li>is it possible to specify the calling convention for a whole class, from which generated members will inherit?</li>
  <li>if the header file does not specify the calling convention and if it can't be modified how to build in <strong>CLR mode "pure"</strong>?</li>
  </ul>
  
  <p>Thanks.</p>