Pau*_*lie 5 c# .net-4.0 imetadataimport
我有自己的使用IMetaDataImport接口的.NET 应用程序调试器
当我调用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
}
Run Code Online (Sandbox Code Playgroud)
调用的方法:
metadataImport.ResolveTypeRef(typeRefToken, ref metadataImportGuid, out metadataObject, out typeDefToken)
Run Code Online (Sandbox Code Playgroud)
通常,该方法应解析类型 System.Exception 或 System.SystemException。
当我将应用程序从 .NET 3.5 移动到 .NET 4 时,出现了问题。
感谢您的回答!
呃,我终于摆脱了这个......解决方案不是调用 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;
}
}
Run Code Online (Sandbox Code Playgroud)
这个想法来自David Broman 的 CLR Profiling API 博客:Metadata Tokens、Run-Time IDs 和 Type Loading(如果您对 MetaDataImport 感兴趣,那么这本书真的很好读)。