4

インターフェイスを使用する.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を解決する必要があります。

この問題は、アプリを.NET3.5から.NET4に移動したときに発生しました。

答えてくれてありがとう!

4

1 に答える 1

3

うーん、私はついにこれを取り除きます...解決策は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に興味がある場合は、非常に読みやすいものです)に基づいています。

于 2012-01-15T22:04:57.820 に答える