Freigeben über


__clrcall

Microsoft-spezifisch

Gibt an, dass eine Funktion nur aus verwaltetem Code aufgerufen werden kann.Verwendung __clrcall für alle virtuellen Funktionen, die nur aus verwaltetem Code aufgerufen wird.Jedoch kann diese Aufrufkonvention für Funktionen verwendet werden, die von systemeigenem Code aufgerufen wird.

Verwendung __clrcall zur Verbesserung der Leistung, wenn aus einer verwalteten Funktion an eine virtuelle verwaltete Funktion oder eine verwaltete Funktion für eine verwaltete Funktion über Zeiger aufrufen.

Einstiegspunkte sind separate, vom Compiler generierten Funktionen.Wenn eine Funktion beide systemeigene und verwaltete Einstiegspunkte verfügt, wird einer von ihnen die eigentliche Funktion mit der Funktionsimplementierung der sein.Die andere Funktion wird eine separate Funktion (einen Thunk) sein, die die aktuelle Funktion aufruft und die common Language Runtime PInvoke durchführen können.Wenn eine Funktion als __clrcall, Sie zeigen die Implementierung der Funktion muss MSIL und, dass die systemeigenen Einstiegspunktfunktion nicht generiert werden.

Wenn die Adresse einer systemeigenen Funktion Wenn unter __clrcall nicht angegeben ist, verwendet der Compiler den systemeigene Einstiegspunkt.__clrcallGibt an, dass die Funktion verwaltet wird, und es keine Notwendigkeit gibt, durch den Übergang vom gehen zum systemeigenen Format verwaltet.In diesem Fall verwendet der Compiler den verwalteten Einstiegspunkt.

Wenn /clr (nicht /clr:pure oder /clr:safe) wird verwendet, und __clrcall wird nicht verwendet, wobei immer die Adresse einer Funktion gibt die Adresse des systemeigenen Einstiegspunktfunktion.Wenn __clrcall wird verwendet, die systemeigenen Einstiegspunktfunktion wird nicht erstellt, so dass Sie die Adresse der verwalteten Funktion, keine Thunk Einstiegspunktfunktion.Weitere Informationen finden Sie unter Doppeltes Thunking (C++).

/clr (Common Language Runtime-Kompilierung)bedeutet, dass alle Funktionen und Funktionszeiger sind __clrcall und der Compiler lässt eine Funktion innerhalb der Kompiliereinheit alles andere als gekennzeichnet werden __clrcall.Wenn /clr:pure wird verwendet, __clrcall kann nur auf Funktionszeigern und externe Deklarationen angegeben werden.

Rufen Sie __clrcall Funktionen aus vorhandenen C++-Code, die mithilfe von kompiliert wurde /clr , sofern diese Funktion eine MSIL-Implementierung verfügt.__clrcallFunktionen können nicht direkt über Funktionen, die Inline-Asm und rufen die CPU-spezifischen Intrinisics, z. B. aufgerufen werden, auch wenn diese Funktionen mit kompiliert werden /clr.

__clrcallFunktionszeiger sind nur in der Anwendungsdomäne, in dem sie erstellt wurden, verwendet werden soll.Statt der Übergabe von __clrcall Funktionszeiger über Anwendungsdomänen hinweg, verwenden Sie CrossAppDomainDelegate.Weitere Informationen finden Sie unter Anwendungsdomänen und Visual C++.

Beispiel

// clrcall.cpp
// compile with: /clr:oldSyntax /LD
void __clrcall Test1( ) {}
void (__clrcall *fpTest1)( ) = &Test1;

Beachten Sie, dass, wenn eine Funktion deklariert ist, mit __clrcall, wird Code generiert, wenn erforderlich; zum Beispiel als Funktion aufgerufen wird.

// clrcall2.cpp
// compile with: /clr
using namespace System;
int __clrcall Func1() {
   Console::WriteLine("in Func1");
   return 0;
}

// Func1 hasn't been used at this point (code has not been generated), 
// so runtime returns the adddress of a stub to the function
int (__clrcall *pf)() = &Func1;

// code calls the function, code generated at difference address
int i = pf();   // comment this line and comparison will pass

int main() {
   if (&Func1 == pf)
      Console::WriteLine("&Func1 == pf, comparison succeeds");
   else 
      Console::WriteLine("&Func1 != pf, comparison fails");

   // even though comparison fails, stub and function call are correct
   pf();
   Func1();
}
  

Das folgende Beispiel zeigt, dass Sie einen Funktionszeiger definieren können, so dass Sie erklären, dass nur der Funktionszeiger aus verwaltetem Code aufgerufen wird.Dadurch wird den Compiler die verwaltete Funktion direkt aufrufen und den systemeigenen Einstiegspunkt (doppelte Thunk Abgang) vermeiden.

// clrcall3.cpp
// compile with: /clr
void Test() {
   System::Console::WriteLine("in Test");
}

int main() {
   void (*pTest)() = &Test;
   (*pTest)();

   void (__clrcall *pTest2)() = &Test;
   (*pTest2)();
}

Siehe auch

Referenz

Argument-Übergeben und Namenskonventionen

C++-Schlüsselwörter