Po przeczytaniu odpowiedzi Larry'ego Ostermana na ten sam problem jestem próbując rozwiązać w tej chwili, myślałem, że znalazłem odpowiedź na moje pytanie.

Dla przypomnienia pytanie brzmiało: jak mogę z .Net (nie-WinRT) wyświetlić listę typów w zestawie WinRT (moje są najwyraźniej pliki .dll, a nie .Winmd)

Dlatego użyłem następującego fragmentu kodu:

//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);

(znaleziono na https://gist.github.com/2920743)

Niestety otrzymuję niezerowy HResult.

Odniosłem się do dokumentacji i znalazłem to :

HR_RESULT_FROM_WIN32(ERROR_NO_PACKAGE) Funkcja została wywołana z procesu, który nie znajduje się w aplikacji Sklepu Windows.

Czy to oznacza, że ​​nie można w ogóle wyświetlić listy typów z .Net (nie-WinRT)?

0
Fabio Salvalai 15 październik 2012, 23:56

2 odpowiedzi

Najlepsza odpowiedź

RoGetMetaDataFile służy do ładowania pliku metadanych z pakietu aplikacji. Lokalizuje plik metadanych, w którym zdefiniowany jest nazwany typ, ładuje ten plik metadanych i zwraca wskaźnik interfejsu IMetaDataImport, który reprezentuje ten plik metadanych.

Ze zwykłego kodu .NET możesz wywołać RuntimeEnvironment.GetRuntimeInterfaceAsIntPtr (lub GetRuntimeInterfaceAsObject), aby uzyskać wskaźnik interfejsu IMetaDataDispenser bieżącego środowiska wykonawczego, który może być użyty do załadowania dowolnych modułów do inspekcji.

Z kodu natywnego możesz wywołać ICLRMetaHost::GetRuntime, aby załadować runtime, a następnie z tego obiektu wywołaj ICLRRuntimeInfo::GetInterface, aby uzyskać jego IMetaDataDispenser wskaźnik interfejsu.

2
James McNellis 16 październik 2012, 00:06

RoGetMetaDataFile może być używany spoza pakietu aplikacji, jednak rozwiązuje tylko typy środowiska uruchomieniowego systemu Windows.

Aby rozwiązać konkretne typy aplikacji, musisz działać z "tożsamością pakietu" - innymi słowy, w kontekście uruchomionej aplikacji.

1
ReinstateMonica Larry Osterman 16 październik 2012, 06:09