与IMetaDataImport问题:: ResolveTypeRef方法方法、问题、IMetaDataImport、ResolveTypeRef

2023-09-07 15:20:21 作者:半途而废

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

I have my own debugger for .NET apps that uses IMetaDataImport interface

当我称之为 ResolveTypeRef 的方法,我总是 NotImplementedException

When I call ResolveTypeRef method, I always get 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
}

该方法调用:

The method calling:

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

通常情况下,该方法应该解决System.Exception类型或System.SystemException。

Typically, the method should resolve type System.Exception or System.SystemException.

问题发生,当我提出从.NET 3.5的应用程序到.NET 4。

The problem occured when I moved app from .NET 3.5 to .NET 4.

谢谢你的答案!

推荐答案

UFF,我终于得到这个去掉?解决的办法不是叫ResolveTypeRef,但创建你自己的方法来解决类型:

Uff, I finally get rid of this ... The solution is not call ResolveTypeRef, but create your own method to resolve type:

  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;
      }
    }

这个想法来源于http://blogs.msdn.com/b/davbr/archive/2011/10/17/metadata-tokens-run-time-ids-and-type-loading.aspx (如果您有兴趣MetaDataImport真的好读书​​)。

The idea comes from http://blogs.msdn.com/b/davbr/archive/2011/10/17/metadata-tokens-run-time-ids-and-type-loading.aspx (really good reading if you are interested in MetaDataImport).