Проблемы с IMetaDataImport :: ResolveTypeRef Метод - PullRequest
3 голосов
/ 15 января 2012

У меня есть собственный отладчик для приложений .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.

Спасибо за ответы!

1 Ответ

2 голосов
/ 16 января 2012

Уфф, я наконец-то избавился от этого ... Решение - это не вызов 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;
      }
    }

Идея взята из Профилирование CLR Дэвида БроманаБлог API: токены метаданных, идентификаторы времени выполнения и загрузка типов (действительно хорошее чтение, если вы заинтересованы в MetaDataImport).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...