Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以从非Windows应用商店应用程序中使用RoGetMetaDataFile_C#_Winapi_Reflection_Windows Runtime_Pinvoke - Fatal编程技术网

C# 是否可以从非Windows应用商店应用程序中使用RoGetMetaDataFile

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

在阅读了我目前正试图解决的同一个问题后,我认为我已经找到了问题的答案

作为记录,问题是:如何从.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);
//注意,此包装函数返回元数据文件名和令牌
//它会立即释放导入器指针
静态元组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应用商店应用程序。当您运行非商店应用程序时,您没有包标识。