在阅读了拉里奥斯特曼对我目前正在尝试解决的同一问题的回复后,我认为我已经找到了问题的答案。
作为记录,问题是:我如何从 .Net(非 WinRT)列出 WinRT 程序集中的类型(我的显然是 .dll 文件,而不是 .Winmd)
因此,我使用了以下代码片段:
//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);
(在https://gist.github.com/2920743上找到)
不幸的是,我得到一个非零的 HResult。
我参考了文档并发现了这一点:
HR_RESULT_FROM_WIN32(ERROR_NO_PACKAGE) 该函数是从不在 Windows 应用商店应用程序中的进程调用的。
这是否意味着根本无法列出 .Net(非 WinRT)中的类型?