Dla części .Net Framework, które są zaimplementowane w C#, najłatwiej je przejrzeć przy pomocy http://referencesource.microsoft.com/. Co do reszty, będziesz musiał pobrać kopię SSCLI lub browse the coreclr repository na GitHub.
Było free eBook published który próbuje wyjaśnić wewnętrzne funkcjonowanie większość SSCLI2, który jest odchudzona wersja .Net 2.
InternalCall
jest obsługiwane przez program przy użyciu mapowania zdefiniowanego in the file ecalllist.h
in coreclr lub w ecall.cpp
dla sscli. Na przykład, Math.Round jest odwzorowany jako:
// snip
FCFuncStart(gMathFuncs)
FCIntrinsic("Sin", COMDouble::Sin, CORINFO_INTRINSIC_Sin)
FCIntrinsic("Cos", COMDouble::Cos, CORINFO_INTRINSIC_Cos)
FCIntrinsic("Sqrt", COMDouble::Sqrt, CORINFO_INTRINSIC_Sqrt)
FCIntrinsic("Round", COMDouble::Round, CORINFO_INTRINSIC_Round)
// snip
Gdybyśmy wtedy patrzeć na klasę COMDouble
, którego realizacja możemy find in comfloat.cpp
widzimy kod za Math.Round
:
/*====================================Round=====================================
**
==============================================================================*/
FCIMPL1_V(double, COMDouble::Round, double x)
FCALL_CONTRACT;
// If the number has no fractional part do nothing
// This shortcut is necessary to workaround precision loss in borderline cases on some platforms
if (x == (double)((INT64)x)) {
return x;
}
// We had a number that was equally close to 2 integers.
// We need to return the even one.
double tempVal = (x + 0.5);
double flrTempVal = floor(tempVal);
if ((flrTempVal == tempVal) && (fmod(tempVal, 2.0) != 0)) {
flrTempVal -= 1.0;
}
return _copysign(flrTempVal, x);
FCIMPLEND
https: // referencesource .microsoft.com/ – Plutonix
lub skorzystaj z dekompilatora. Jest wiele darmowych – Jonesopolis
Istnieją również odpowiedniki NET dla wszystkich starszych funkcji VB, jeśli nie podoba ci się dokładnie, jak działają – Plutonix