Переместить элемент в начало массива

Вам понадобится исходный код для CLR, чтобы увидеть реализацию этих методов. Это немного сложно, Microsoft не публикует его, и он не распространяется на Reference Source.

Пока метод «старый», доступный с .NET 2.0, У вас есть выстрел в него из исходного кода SSCLI20 . С ненулевым риском вы, конечно, будете смотреть на устаревшую версию кода. Но достаточно хорошо, чтобы понять, как это выглядит и часто все еще точнее.

Отправной точкой для начала поиска кода является файл исходного кода clr / src / vm / ecall.cpp. Он содержит таблицы, в которых дрожание ищет внутренние методы. Раздел, относящийся к nativeCompareOrdinalEx (), выглядит следующим образом:

FCFuncStart(gStringFuncs)
    FCDynamic("FastAllocateString", CORINFO_INTRINSIC_Illegal, ECall::FastAllocateString)
    FCDynamicSig(COR_CTOR_METHOD_NAME, &gsig_IM_ArrChar_RetVoid, CORINFO_INTRINSIC_Illegal, ECall::CtorCharArrayManaged)
    FCDynamicSig(COR_CTOR_METHOD_NAME, &gsig_IM_ArrChar_Int_Int_RetVoid, CORINFO_INTRINSIC_Illegal, ECall::CtorCharArrayStartLengthManaged)
    FCDynamicSig(COR_CTOR_METHOD_NAME, &gsig_IM_PtrChar_RetVoid, CORINFO_INTRINSIC_Illegal, ECall::CtorCharPtrManaged)
    FCDynamicSig(COR_CTOR_METHOD_NAME, &gsig_IM_PtrChar_Int_Int_RetVoid, CORINFO_INTRINSIC_Illegal, ECall::CtorCharPtrStartLengthManaged)
    FCDynamicSig(COR_CTOR_METHOD_NAME, &gsig_IM_Char_Int_RetVoid, CORINFO_INTRINSIC_Illegal, ECall::CtorCharCountManaged)

    FCFuncElement("nativeCompareOrdinal", COMString::FCCompareOrdinal)     // <=== Here
    FCFuncElement("nativeCompareOrdinalWC", COMString::FCCompareOrdinalWC)
    FCIntrinsic("get_Length", COMString::Length, CORINFO_INTRINSIC_StringLength)
    // etc..
}

Обратите внимание, как FCFuncElement имеет имя метода в виде строки и указатель на метод C ++, который реализует внутренний вызов. Грепирование дерева исходного кода приведет вас к clr / src / vm / comstring.cpp.

/*================================CompareOrdinal===============================*/
FCIMPL3(INT32, COMString::FCCompareOrdinal, StringObject* strA, StringObject* strB, CLR_BOOL bIgnoreCase) {
    // Yadayada
    //...
}

Поиск CaseInsensitiveCompHelper () и FastCompareStringHelperAligned () возвращает вас к фактическим реализациям, соответственно, case- нечувствительные и чувствительные к регистру функции сравнения в одном и том же файле исходного кода.

Единственное, что примечательно в этом, это то, что версия CLR 4 внесла некоторые изменения в этот механизм. Добавление множества новых внутренних методов и поддержка совершенно другого дополнительного механизма взаимодействия с помощью атрибута [DllImport] для поддельной DLL с именем «QCall». Нет никакого способа увидеть источник этих дополнений, о которых я знаю.


UPDATE: источник теперь доступен из проекта CoreCLR . Таблица была перенесена с ecall.cpp на ecalllist.h, механики все те же. Имейте в виду, что это версия .NETCore для CLR, источник настольной версии по-прежнему закрыт. Однако две версии имеют много общего.

-1
задан sreejithsdev 17 January 2019 в 07:18
поделиться