4

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

当我调用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 时出现了问题。

感谢您的回答!

4

1 回答 1

3

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 Profiling API 博客:Metadata Tokens, Run-Time IDs, and Type Loading(如果您对 MetaDataImport 感兴趣,这真的很不错)。

于 2012-01-15T22:04:57.820 回答