Проблемы с 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 устарели с фактической реализацией.