2009-06-11 3 views
3

Ich habe eine .Net-App, die als "Any CPU" kompiliert wurde. Ich verwende es auf einem x64-Betriebssystem, so dass es als 64bit läuft. Die Anwendung lädt andere vom Benutzer bereitgestellte Assemblys. Es verwendet natürlich die Reflexion, um Typen von der vom Benutzer bereitgestellten Assembly zu lesen. Alles funktioniert gut, wenn die Benutzerbaugruppe als "Beliebige CPU" kompiliert wird. Aber wenn die Assembly als x86 kompiliert wird, bekomme ich die "Dies ist keine Win32-Anwendung" Ausnahme zum Zeitpunkt der Reflektion. Es ist offensichtlich aufgrund der Tatsache, dass die Host-App 64bit läuft.Reflektieren über eine x86-Baugruppe von einer "Any CPU" -Anwendung auf x64-Bit-Betriebssystem

Meine Frage ist, wie kann ich das umgehen? Irgendwelche Gedanken/Ideen?

Danke

Antwort

0

Sie könnten die Datei kopieren und das Bit ändern.

0

Wenn Sie nur für reflektierende Zwecke laden müssen, können Sie die Mono.Cecil verwenden, die ich denke, sollte in Ordnung sein.

Alternativ nehmen Sie eine Kopie der DLL, führen Sie corflags gegen die Datei, um die 32-Bit-Only-Flag zu spiegeln und laden Sie dann die Kopie.

Die erste ist viel besser and faster für nur reflektieren, nie tatsächlich einen Typ instantiieren, sondern von Natur aus mehr Aufwand. Die zweite ist fehleranfällig (die DLL kann Abhängigkeiten von nicht verwaltetem Code haben, der, wenn er durch den Reflektionsscan ausgelöst wird, egal was passiert.

Als dritte, alternative Option, um das Problem zu umgehen nur als 32bit, dann sollte es alles in Ordnung laden. haben Sie wirklich müssen 64bit laufen?

+0

Wenn ich 32bit ausführen, werde ich Probleme mit Assemblys, die 64bit sind, die ich auch habe einen Fall haben. Ich könnte versuchen, mit ReflectionOnly laden und sehen, ob das funktioniert. Alles, was ich tun muss, ist nur über die Baugruppe nachzudenken, um Typen zu lesen. Ich führe eigentlich nichts aus. Nun ... Ich muss Attribute nachschlagen, das kann ein Problem sein, da es nachschlagen führt es aus:/ – Nazeeh

+0

Eine 64-Bit nur .Net-Assembly ist unglaublich selten in meiner Erfahrung, sie sind fast immer Mixed-Modus. Sie tun vielleicht Arbeit, die sie verwendet, aber überlegen, ob Sie sich kümmern müssen. Das Lesen von Typen/Attributen ist etwas, das Cecil für dich tun wird, also schlage ich vor, dass du diese Route machst ... – ShuggyCoUk

5

Ok. ich es herausgefunden. für meine Zwecke, die nur für eine Baugruppe eine einfache Art Entdeckung waren aber keine Instanziierung Verwenden von Assembly.ReflectionOnlyLoad funktioniert, wenn die Assembly 32 Bit ist

Sie laden die Assembly mit Assembly.ReflectionOnlyLoad, und Sie sind berechtigt, r Auswirkungen auf die Typen. Sie sollten auch die AppDomain.CurrentDomain.ReflectionOnlyLoadResolve verwenden.

Um Attributnamen zu erhalten, müssen Sie CustomAttributeData.GetCustomAttributes für einen Typ, eine Methode oder ein Modul verwenden.

+0

Das ist gut zu wissen – ShuggyCoUk