从CorElementType获取TypeToken ELEMENT_TYPE_GENERICINST

时间:2019-01-21 12:31:48

标签: c++ .net clr coreclr

我已经构建了自定义的IL Rewriter,但是对于通用方法,retType是ELEMENT_TYPE_GENERICINST。

我不知道要为ELEMENT_TYPE_GENERICINST获得typeToken。 我可以使用此方法获取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;
}

0 个答案:

没有答案