Получить TypeToken из CorElementType ELEMENT_TYPE_GENERICINST - PullRequest
0 голосов
/ 21 января 2019

Я создал пользовательский IL Rewriter, но для универсального метода retType имеет вид ELEMENT_TYPE_GENERICINST.

Я понятия не имею, чтобы получить typeToken для ELEMENT_TYPE_GENERICINST.Я могу получить ELEMENT_TYPE_MVAR и ELEMENT_TYPE_VAR для этого метода:

mdToken GetVariableTypeToken(CComPtr<IMetaDataImport> pIMetaDataImport, PCCOR_SIGNATURE sig, ULONG sigSize)
{
    const ULONG  MAX_TOKEN_SIZE = 2048;
    HCORENUM    phEnum = NULL;
    mdTypeSpec rTokens[MAX_TOKEN_SIZE];
    ULONG       pcTokensNum = 0;
    HRESULT hr = pIMetaDataImport->EnumTypeSpecs(&phEnum, rTokens, MAX_TOKEN_SIZE, &pcTokensNum);
    if (SUCCEEDED(hr))
    {
        const ULONG  MAX_SIG_SIZE = 20;
        byte typeSig[MAX_SIG_SIZE];
        PCCOR_SIGNATURE typeSpecSig = typeSig;
        ULONG pcbSig = 0;
        for (size_t i = 0; i < pcTokensNum; i++)
        {
            pIMetaDataImport->GetTypeSpecFromToken(rTokens[i], &typeSpecSig, &pcbSig);
            if (pcbSig == sigSize)
            {
                size_t size = min(sigSize, MAX_SIG_SIZE);
                size_t j = 0;
                for (j = 0; j < size; j++)
                {
                    if (typeSpecSig[j] != sig[j])
                        break;
                }

                if (j == size)
                {
                    return rTokens[i];
                }
            }
        }
    }

    pIMetaDataImport->CloseEnum(phEnum);
    return 0;
}
...