0

私が現在解決しようとしているのとまったく同じ問題に関するLarry Osterman の回答を読んだ後、私は自分の質問に対する答えを見つけたと思いました。

記録のために、質問は次のとおりでした: .Net (非 WinRT) から WinRT アセンブリの型を一覧表示するにはどうすればよいですか (私のファイルは明らかに .Winmd ではなく .dll ファイルです)。

したがって、次のコード スニペットを使用しました。

//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) の型をまったく一覧表示できないということですか?

4

2 に答える 2

2

RoGetMetaDataFileアプリ パッケージ内からメタデータ ファイルを読み込むために使用されます。名前付きの型が定義されているメタデータ ファイルを検索し、そのメタデータ ファイルを読み込み、そのメタデータ ファイルIMetaDataImportを表すインターフェイス ポインターを返します。

通常の .NET コードからRuntimeEnvironment.GetRuntimeInterfaceAsIntPtr(またはGetRuntimeInterfaceAsObject) を呼び出して、現在のランタイムのIMetaDataDispenserインターフェイス ポインターを取得できます。これを使用して、検査のために任意のモジュールを読み込むことができます。

ネイティブ コードから呼び出しICLRMetaHost::GetRuntimeてランタイムをロードし、そのオブジェクト呼び出しからインターフェイス ポインターICLRRuntimeInfo::GetInterfaceを取得できます。IMetaDataDispenser

于 2012-10-15T20:06:55.720 に答える
1

RoGetMetaDataFileアプリ パッケージの外部から使用できますが、システムの Windows ランタイム タイプのみを解決します。

アプリ固有のタイプを解決するには、「パッケージ ID」を使用して実行する必要があります。つまり、実行中のアプリケーションのコンテキストで実行する必要があります。

于 2012-10-16T02:09:59.620 に答える