IMetaDataImport::ResolveTypeRef方法存在问题



我有自己的.NET应用程序调试器,它使用IMetaDataImport接口

当我调用ResolveTypeRef方法时,我总是得到NotImplementedException

ResolveTypeRef的定义如下:

[ComImport]
[Guid("....")] //a valid GUID
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[CLSCompliant(false)]
public interface IMetaDataImport {
  void ResolveTypeRef(
    [ComAliasName("mdTypeRef")] mdToken tr,
    [ComAliasName("REFIID")] ref Guid riid,
    [ComAliasName("IUnknown**"), Out, MarshalAs(UnmanagedType.IUnknown)] out object ppIScope,
    [ComAliasName("mdTypeDef*"), Out] out mdToken ptd
  );
  // ... other methods from IMetaDataImport
}

方法调用:

metadataImport.ResolveTypeRef(typeRefToken, ref metadataImportGuid, out metadataObject, out typeDefToken)

通常,该方法应解析类型System.Exception或System.SystemException.

将应用程序从.NET 3.5移动到.NET 4时出现问题。

谢谢你的回答!

Uff,我终于摆脱了这个。。。解决方案不是调用ResolveTypeRef,而是创建自己的方法来解析类型:

  mdToken ptkResScope;
  uint len;
  metadataImport.GetTypeRefProps(typeRef, out ptkResScope, null, 0, out len);
  StringBuilder sb = new StringBuilder((int)len);
  metadataImport.GetTypeRefProps(typeRef, out ptkResScope, sb, len, out len);
  string className = sb.ToString();
  foreach (loadedModule ) {   // this is quite tricky part ...     
    metadataImportForLoadedModule = GetMetaDataImportForModule(loadedModule);
    metadataImportForLoadedModule.FindTypeDefByName(className, mdToken.Nil, out typeDef);
    if ( typeDef.IsNonNil(CorTokenType.mdtTypeDef) ) {
      return typeDef;
      }
    }

这个想法来自David Broman的CLR评测API博客:元数据令牌、运行时ID和类型加载(如果你对MetaDataImport感兴趣,那真的很好)。

如果你真的尝试并进入方法ResolveTypeRef,那么看起来你实际上最终到达了SymMethod::GetSourceStartEnd,这就是返回E_NOTIMPL的内容。此外,如果你看看IDA中的vtable,就我所见,方法ResolveTypeRef甚至不存在于IMetaDataImport/2的vtable上;相反,它是CordbModule上的一个方法,但显然实际上并没有在ICorDebugModule接口中公开。

无论如何,这里的结论似乎是,微软的文档/头文件与实际实现已经过时了

相关内容

  • 没有找到相关文章

最新更新