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时出现问题。
谢谢你的答案!
Uff,我终于摆脱了这个……解决方案不是调用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感兴趣)。