C# 是否可以从非Windows应用商店应用程序中使用RoGetMetaDataFile
在阅读了我目前正试图解决的同一个问题后,我认为我已经找到了问题的答案 作为记录,问题是:如何从.Net(非WinRT)列出WinRT程序集中的类型(我的是.dll文件,而不是.Winmd) 因此,我使用了以下代码段:C# 是否可以从非Windows应用商店应用程序中使用RoGetMetaDataFile,c#,winapi,reflection,windows-runtime,pinvoke,C#,Winapi,Reflection,Windows Runtime,Pinvoke,在阅读了我目前正试图解决的同一个问题后,我认为我已经找到了问题的答案 作为记录,问题是:如何从.Net(非WinRT)列出WinRT程序集中的类型(我的是.dll文件,而不是.Winmd) 因此,我使用了以下代码段: //note, this wrapper function returns the metadata file name and token // it immediately releases the importer pointer static Tuple<stri
//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);
//注意,此包装函数返回元数据文件名和令牌
//它会立即释放导入器指针
静态元组ResolveTypeName(字符串typename)
{
字符串路径;
对象导入器=null;
UInt32令牌;
尝试
{
var hr=RoGetMetaDataFile(typename,IntPtr.Zero,out路径,out导入器,out令牌);
//TODO:检查HR是否存在错误
返回Tuple.Create(路径、令牌);
}
最后
{
发布对象元帅(进口商);
}
}
[DllImport(“WinTypes.dll”)]
静态外部UInt32 RoGetMetaDataFile(
[Marshallas(UnmanagedType.HString)]字符串名称,
IntPtr元数据分发器,
[Marshallas(UnmanagedType.HString)]输出字符串metaDataFilePath,
[Marshallas(UnmanagedType.Interface)]输出对象元数据导入,
out UInt32 typeDefToken);
(于上找到)
不幸的是,我得到了一个非零的HResult
我参考了文件,发现:
HR\u RESULT\u FROM\u WIN32(错误\u NO\u包)函数是从
不在Windows应用商店应用程序中的进程
这是否意味着根本无法从.Net(非WinRT)中列出类型?
RoGetMetaDataFile
用于从应用程序包中加载元数据文件。它定位定义了命名类型的元数据文件,加载该元数据文件,并返回表示该元数据文件的IMetaDataImport
接口指针
从普通.NET代码中,您可以调用(或GetRuntimeInterfaceAsObject
)以获取当前运行时的IMetaDataDispenser
接口指针,该指针可用于加载任意模块进行检查
从本机代码中,您可以调用加载运行时,然后从该对象调用获取其
IMetaDataDispenser
接口指针。RoGetMetaDataFile
用于从应用程序包中加载元数据文件。它定位定义了命名类型的元数据文件,加载该元数据文件,并返回表示该元数据文件的IMetaDataImport
接口指针
从普通.NET代码中,您可以调用(或GetRuntimeInterfaceAsObject
)以获取当前运行时的IMetaDataDispenser
接口指针,该指针可用于加载任意模块进行检查
您可以从本机代码中调用以加载运行时,然后从该对象调用以获取其
IMetadatDispenser
接口指针。RoGetMetaDataFile
可以从应用程序包外部使用,但它将仅解析系统windows运行时类型
为了解析特定于应用程序的类型,您需要使用“程序包标识”运行—换句话说,在正在运行的应用程序的上下文中。
RoGetMetaDataFile
可以从应用程序包外部使用,但它只解析系统windows运行时类型
为了解析特定于应用程序的类型,您需要使用“包标识”运行—换句话说,在运行的应用程序上下文中运行。谢谢!这使我走上了正确的道路。我设法得到了一个MetadataDispender,并对其调用OpenScope,得到了一个指向IMetaDataImport接口的指针。我想现在,我必须找出接口的C#声明,以便调用其方法并检查其内部。谢谢!这使我走上了正确的道路。我设法得到了一个MetadataDispender,并对其调用OpenScope,得到了一个指向IMetaDataImport接口的指针。我想现在,我必须找出接口的C#声明,以便调用其方法并检查其内部。谢谢Larry。当你说“在运行的应用程序的上下文中”,你是指WinRT应用程序,对吗?在这种情况下,我想这个API不会对我有多大帮助,因为我想从T4模板中探索类型:SYes,一个windows应用商店应用程序。当您运行非商店应用程序时,您没有包标识。谢谢Larry。当你说“在运行的应用程序的上下文中”,你是指WinRT应用程序,对吗?在这种情况下,我想这个API不会对我有多大帮助,因为我想从T4模板中探索类型:SYes,一个windows应用商店应用程序。当您运行非商店应用程序时,您没有包标识。