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