问题
I have my own debugger for .NET apps that uses IMetaDataImport interface
When I call ResolveTypeRef
method, I always get NotImplementedException
.
The definition of ResolveTypeRef
is like this:
[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
}
The method calling:
metadataImport.ResolveTypeRef(typeRefToken, ref metadataImportGuid, out metadataObject, out typeDefToken)
Typically, the method should resolve type System.Exception or System.SystemException.
The problem occured when I moved app from .NET 3.5 to .NET 4.
Thanks for the answers!
回答1:
Uff, I finally get rid of this ... The solution is not call ResolveTypeRef, but create your own method to resolve type:
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;
}
}
The idea comes from David Broman's CLR Profiling API Blog: Metadata Tokens, Run-Time IDs, and Type Loading (really good reading if you are interested in MetaDataImport).
来源:https://stackoverflow.com/questions/8865239/problems-with-imetadataimportresolvetyperef-method