__clrcall
Microsoft özel
Bir işlev yalnızca yönetilen koddan çağrılacak belirtir. Use __clrcall yönetilen kod adlı yalnızca tüm sanal işlevler için. Ancak bu çağrı kuralı yerel kod adlı işlevleri kullanılamaz.
Use __clrcall sanal bir yönetilen işlev için yönetilen bir işlev ya da yönetilen işlev işaretçisi ile yönetilen işlevi çağrılırken performansını artırmak için.
Giriş noktalarını ayrı, derleyicinin ürettiði işlevlerdir. Hem yerel ve yönetilen giriş noktalarını bir işlevi vardır, bunlardan biri gerçek işlev işlevini uygulaması ile olacaktır. Diğer işlevi gerçek işlevini çağırır ve ortak dil çalışma zamanı PInvoke gerçekleştirmek izin verir ayrı işlev (thunk) olacaktır. Bir işlev olarak işaretleme, __clrcall, işlevi uygulama MSIL olması ve doğal giriş noktası işlevini değil oluşturulan gösterir.
Yerel işlev adresi, çekerken __clrcall belirtilmezse, derleyici doğal giriş noktası kullanır. __clrcallişlev yönetilen ve geçiş adımlarını gerek yönetilen için yerel olan gösterir. Bu durumda, derleyici yönetilen giriş noktası kullanır.
Zaman /clr (değil /clr:pure veya /clr:safe) kullanılır ve __clrcall olan kullanılmayan, işlev adresi her zaman ayırdığınız doğal giriş noktası işlevini adresini döndürür. Zaman __clrcall durumda olmayan bir giriş noktası thunk işlevini yönetilen işlevinin adresini elde etmek için kullanılan yerel giriş noktası işlevini oluşturulmaz. Daha fazla bilgi için bkz. Çift Dönüştürme (C++).
/CLR (ortak dil çalışma zamanı derleme)tüm işlevler ve işlev işaretçileri gösterir __clrcall ve derleyici bir işlev içinde hiçbir şey dışında tutulması için compiland izin __clrcall. Zaman /clr:pure kullanılan __clrcall işlev işaretçileri ve harici bildirimleri yalnızca belirtilebilir.
Doğrudan arama __clrcall kullanarak derlenen C++ kodu varolan işlevlerden /clr bu işlevi MSIL uygulaması olduğu sürece. __clrcallişlevleri ile işlevleri derlenmiş bile doğrudan satıriçi asm ve cpu özgü intrinisics, örneğin, arama işlevlerini çağrılamaz /clr.
__clrcallişlev işaretçileri, yalnızca uygulama etki alanında oluşturulmuş olan kullanılacak yöneliktir. Geçirme yerine __clrcall işlev işaretçileri uygulama etki alanları, kullanmak CrossAppDomainDelegate. Daha fazla bilgi için bkz. Uygulama Etki Alanları ve Visual C++.
Örnek
// clrcall.cpp
// compile with: /clr:oldSyntax /LD
void __clrcall Test1( ) {}
void (__clrcall *fpTest1)( ) = &Test1;
Bir işlev ile bildirilen dikkat __clrcall, kod oluşturulur, gerektiğinde; Örneğin, ne zaman işlevi çağrılır.
// 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();
}
İşlev işaretçisi yönetilen koddan çağrılacak bildirmek gibi aşağıdaki örnek, bir işlev işaretçisini tanımlayabilirsiniz gösterir. Bu derleyici doğrudan yönetilen işlev çağrısı ve yerel giriş noktası (çift thunk sorun) önlemek sağlar.
// clrcall3.cpp
// compile with: /clr
void Test() {
System::Console::WriteLine("in Test");
}
int main() {
void (*pTest)() = &Test;
(*pTest)();
void (__clrcall *pTest2)() = &Test;
(*pTest2)();
}