Sdílet prostřednictvím


__clrcall

Konkrétní společnosti Microsoft

Určuje, že funkci lze volat pouze z spravovaný kód.Použití __clrcall pro všechny virtuální funkce, které budou volat pouze z spravovaný kód.Tato konvence volání však nelze použít pro funkce, která bude volána z nativního kódu.

Použití __clrcall zvýšení výkonu při volání z spravované funkce virtuální spravované funkce nebo spravované funkci k funkci spravované pomocí ukazatele.

Vstupní body jsou samostatné, kompilátor generovaných funkcí.Funkce má i nativní a spravované vstupních bodů, jeden z nich skutečné funkce s implementací funkce bude.Další funkce budou zvláštní funkce (jádro), která volá do skutečné funkce a umožňuje společný jazykový modul runtime provést PInvoke.Při označení funkce jako __clrcall, označte implementace funkce musí být MSIL a funkci nativní vstupního bodu nebude vygenerována.

Při přijímání adresu nativní funkce, pokud __clrcall není zadána, kompilátor používá nativní vstupní bod.__clrcalloznačuje, že funkce je spravován a je potřeba projít přechod od spravované nativních.V takovém případě kompilátor používá spravované vstupní bod.

Při /clr (není /clr:pure nebo /clr:safe) se používá a __clrcall se nepoužívá, přičemž adresu funkce vždy vrátí adresu funkci nativní vstupního bodu.Při __clrcall je použita, funkci nativní vstupního bodu není vytvořen, takže získání adresy spravované funkce není funkci vstupního bodu jádro.Další informace naleznete v tématu Dvojitý převod adres na jinou bitovou šířku (jazyk C++).

/CLR (kompilace společné Language Runtime)znamená, že všechny funkce a funkce ukazatele jsou __clrcall a kompilátor neumožní funkci uvnitř compiland než cokoli označeno __clrcall.Při /clr:pure se používá __clrcall lze zadat pouze na ukazatele funkce a externí prohlášení.

Můžete volat přímo __clrcall z existujícího kódu jazyka C++, který byl kompilován pomocí funkce /clr jako funkce má MSIL implementace.__clrcallnelze volat funkce přímo z funkce, které mají vložené asm a volání specifické procesoru intrinisics například i v případě, že tyto funkce jsou kompilovány s /clr.

__clrcallFunkce ukazatele jsou určeny pouze pro domény aplikace, ve kterém byly vytvořeny.Namísto předání __clrcall funkce ukazatelů mezi doménami aplikace, použijte CrossAppDomainDelegate.Další informace naleznete v tématu Domény aplikace a Visual C++.

Příklad

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

Poznámka: Pokud je funkce deklarována s __clrcall, bude vygenerován kód, podle potřeby; například když funkce je volána.

// 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();
}
  

Následující příklad ukazuje definovat ukazatel na funkci, prohlásit, že ukazatel funkce bude vyvolána pouze ze spravovaného kódu.To umožňuje kompilátor spravované funkci volat přímo a vyhnout se nativní vstupní bod (dvojité jádro problém).

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

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

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

Viz také

Referenční dokumentace

Argument předávání a konvence pojmenování

Klíčových slov jazyka C++