Проблемы с 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.

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

2 ответа

Решение

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

Идея взята из http://blogs.msdn.com/b/davbr/archive/2011/10/17/metadata-tokens-run-time-ids-and-type-loading.aspx (действительно хорошее чтение, если вы заинтересованы в MetaDataImport).

Если вы на самом деле попытаетесь вступить в метод, кажется, что вы на самом деле окажетесь на SymMethod::GetSourceStartEndчто возвращается E_NOTIMPL. Кроме того, если вы посмотрите на vtable в IDA, насколько я вижу метод ResolveTypeRefдаже не существует на IMetaDataImport/2виртуальная таблица; скорее, это метод CordbModule, однако, очевидно, на самом деле не выставлен в ICorDebugModuleинтерфейс.

В любом случае вывод здесь, по-видимому, заключается в том, что файлы документации/заголовков Microsoft устарели с фактической реализацией.

Другие вопросы по тегам