CurrentDomain.AssemblyResolve wird nicht ausgelöst, wenn die Assembly als Unterklasse verwendet wird

8

Ich versuche, das CurrentDomain.AssemblyResolve -Ereignis zu verwenden, um eine DLL zu laden, die als eine eingebettete Ressource markiert ist. Mein Problem ergibt sich speziell aus der Tatsache, dass ich versuche, die Assembly als Unterklasse zu verwenden:

%Vor%

Die Testklasse SubClass ist definiert als:

%Vor%

Wenn die erste Zeile #define BROKEN unkommentiert bleibt, wird das CurrentDomain.AssemblyResolve -Ereignis niemals ausgelöst und System.IO.FileNotFoundException wird ausgelöst und mir wird gesagt, dass SubClass nicht gefunden werden kann. Wenn die erste Zeile entfernt oder auskommentiert wird, wird das Ereignis ausgelöst (aber ich kann es nicht auf diese Weise verwenden).

Ich habe auch versucht, Main in seine eigene Klasse zu verschieben, anstatt dieselbe Klasse eine Instanz von sich selbst erstellen zu lassen, aber ich bekomme die exact same Ausnahme.

Also, wie bekomme ich dieses Ereignis korrekt verdrahtet, damit es diese Baugruppe unter diesen Bedingungen lädt?

In VS 2010 .NET 4 kompiliert, wenn das für irgendjemanden einen Unterschied macht. Auch für jeden, der versucht, dies nachzubilden. SubClass ist in einem eigenen Projekt. Fügen Sie SubClass als Referenz zu TestConsole hinzu und markieren Sie sie als Copy Local = False. Ich habe irgendwo gelesen, dass dies keine Projektreferenz sein kann, sondern eine direkte Referenz auf die DLL. Fügen Sie dann die DLL-Datei zum TestConsole-Projekt hinzu und markieren Sie sie als eingebettete Ressource, nicht als Standard von Inhalt.

    
Jim 22.05.2011, 15:57
quelle

1 Antwort

19

Denken Sie an Load-Order ... Um JIT zu starten und Main aufzurufen, muss es Program verstehen. Es kann Programm nicht verstehen, ohne die Basisklasse zu laden, die spezielle Behandlung erfordert. Das Ereignis feuert nicht , weil es noch nicht registriert ist (weil Main nicht gestartet wurde).

Das kann nicht funktionieren. Die einzige Möglichkeit, dies zu tun, ist einen Einstiegspunkt zu haben, der von nichts anderem abhängt. Beachten Sie, dass JIT vor dem Start der Methode ausgeführt wird, sodass das Main auch nichts enthalten kann, das nicht bekannt ist. Zum Beispiel könnten Sie tun:

%Vor%

Beachten Sie, dass wir 2 Methoden oben brauchen, da es nicht Main JIT kann, außer es kann Programm vollständig auflösen. Mit dem obigen sollte das Ereignis ausgelöst werden, kurz bevor MainCore () aufgerufen wird (z. B. während JIT für MainCore).

    
Marc Gravell 22.05.2011, 16:13
quelle