After reading Larry Osterman’s response on the very same issue I am trying to solve at the moment, I thought I had found the answer to my question.
For the record, the question was : how can I from .Net (non-WinRT) list the types in a WinRT assembly ( mine are .dll files apparently, not .Winmd)
I therefore used the following code snippet :
//note, this wrapper function returns the metadata file name and token
// it immediately releases the importer pointer
static Tuple<string, UInt32> ResolveTypeName(string typename)
{
string path;
object importer = null;
UInt32 token;
try
{
var hr = RoGetMetaDataFile(typename, IntPtr.Zero, out path, out importer, out token);
//TODO: check HR for error
return Tuple.Create(path, token);
}
finally
{
Marshal.ReleaseComObject(importer);
}
}
[DllImport("WinTypes.dll")]
static extern UInt32 RoGetMetaDataFile(
[MarshalAs(UnmanagedType.HString)] string name,
IntPtr metaDataDispenser,
[MarshalAs(UnmanagedType.HString)] out string metaDataFilePath,
[MarshalAs(UnmanagedType.Interface)] out object metaDataImport,
out UInt32 typeDefToken);
( found on https://gist.github.com/2920743)
Unfortunately, I get a non-zero HResult.
I referred to the documentation and found this :
HR_RESULT_FROM_WIN32(ERROR_NO_PACKAGE) The function was called from a
process that is not in a Windows Store app.
Does that mean it is not possible to list the types from .Net (non-WinRT) at all ?
RoGetMetaDataFileis used to load a metadata file from within an app package. It locates the metadata file in which the named type is defined, loads that metadata file, and returns anIMetaDataImportinterface pointer that represents that metadata file.From ordinary .NET code you can call
RuntimeEnvironment.GetRuntimeInterfaceAsIntPtr(orGetRuntimeInterfaceAsObject) to get the current runtime’sIMetaDataDispenserinterface pointer, which can be used to load arbitrary modules for inspection.From native code, you can call
ICLRMetaHost::GetRuntimeto load a runtime, then from that object callICLRRuntimeInfo::GetInterfaceto get itsIMetaDataDispenserinterface pointer.