Compiler Error C3642

 

The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.

The latest version of this topic can be found at Compiler Error C3642.

return_type/args' : cannot call a function with __clrcall calling convention from native code

A function that is marked with the __clrcall calling convention cannot be called from native (unmanaged) code.

return_type/args is either the name of the function or the type of the __clrcall function you are trying to call. A type is used when you're calling through a function-pointer.

To call a managed function from a native context, you can add a "wrapper" function that will call the __clrcall function. Or, you can use the CLR marshalling mechanism; see How to: Marshal Function Pointers Using PInvoke for more information.

The following sample generates C3642:

// C3642.cpp  
// compile with: /clr  
using namespace System;  
struct S {  
   void Test(String ^ s) {   // CLR type in signature, implicitly __clrcall  
      Console::WriteLine(s);  
   }  
   void Test2(char * s) {  
      Test(gcnew String(s));  
   }  
};  
  
#pragma unmanaged  
int main() {  
   S s;  
   s.Test("abc");   // C3642  
   s.Test2("abc");   // OK  
}  

Show: