2017-09-08 2 views
3

Ich habe eine ausführbare Datei namens ess.exe. Ich erzeuge eine XmlSerializer DLL dafür mit sgen.exe, und wenn ich es ausführe, nimmt es die generierte ess.XmlSerializers.dll und alles ist gut.Wie Sie eine Sgen-generierte XmlSerializer-DLL für eine DLL anstelle einer EXE abholen?

Ich habe auch eine DLL namens EntrianSourceSearch_14.dll, die dynamisch geladen wird mit Assembly.LoadFrom(DllPathname). Wenn ich eine XmlSerializer-DLL für diese DLL erzeuge, nimmt sie nicht die generierte DLL ab; Stattdessen wird auf die Laufzeitgenerierung des XML-Serialisierungscodes zurückgegriffen.

Wie bekomme ich meine DLL, um die entsprechende generierte XmlSerializer DLL abzuholen?

Edit: Ich kann nicht die XmlSerializer-DLL in das Verzeichnis der ausführbaren Datei, da meine DLL Teil einer Visual Studio-Erweiterung ist - die ausführbare Datei ist Visual Studio (devenv.exe), und kopieren Stücke meines Produkts in sein Verzeichnis würde wahrscheinlich als antisozial angesehen werden. :-)

Bearbeiten, um mehr Kontext hinzuzufügen: Dies ist ein Visual Studio-Add-In und Erweiterung. Es funktioniert mit allen Versionen von Visual Studio von 2005 bis 2017. Der Großteil des Codes wird in Programme installiert und ältere Versionen von Visual Studio laden sie einfach von dort als Add-In. Für neuere Versionen von Visual Studio, die Add-Ins nicht unterstützen, gibt es eine Erweiterung, die nur ein Loader für diese Hauptkomponenten in Programme ist. Diese Erweiterung verwendet LoadFrom, um diese Hauptkomponenten zu laden, von denen eine EntrianSourceSearch_14.dll ist.

+0

Sie einen Ausschnitt des Codes sehen kann, dass die Assembly lädt in [diesem Beitrag] (https://stackoverflow.com/a/3798614/17034). Beachten Sie den Aufruf von Assembly.Load(), es wird nicht in demselben Verzeichnis suchen, das LoadFrom() ausgeführt hat. Sie können dies mit Fuslogvw.exe überprüfen. Ziehen Sie in Betracht, die Assembly xmlserializers.dll in dasselbe Verzeichnis wie die exe zu verschieben. –

+0

@HansPassant: Danke für die Erklärung und den Link zum Assembly-Loading-Code. In Bezug auf "die xmlserializers.dll-Assembly in dasselbe Verzeichnis wie die Exe zu verschieben", ist die DLL Teil einer Visual Studio-Erweiterung, also ist die ausführbare Datei Visual Studio (devenv.exe). Das Kopieren von Teilen meines Produkts in sein Verzeichnis würde wahrscheinlich als antisozial angesehen werden! – RichieHindle

+0

Wichtige Details wie das gehören in die Frage, kein Kommentar. Fügen Sie so viele kontextbezogene Informationen wie möglich hinzu. Dann noch etwas mehr. –

Antwort

2

Wenn Sie bereits eine signierte Serialisierungsassembly erstellen und bereitstellen, können Sie einen CurrentlDomain.AssemblyResolve Handler hinzufügen, während Sie die Serializer laden und zwischenspeichern, so etwas wie:

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var codeBase = new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath; 
     var serializerPath = Path.Combine(Path.GetDirectoryName(codeBase), new AssemblyName(args.Name).Name + ".dll"); 
     if (File.Exists(serializerPath)) 
      return Assembly.LoadFrom(serializerPath); 
     else 
      return null; 
    } 

Allerdings konnte ich nicht einen einfachen Weg finden Fügen Sie die Bereitstellung der Serialisierungsassembly in einer VS-Erweiterung für eine einzelne Assembly hinzu.

Ich habe eine alternative Methode gefunden, die vorzuziehen sein könnte. Es vermeidet Assembly.LoadFrom direkt und einige der Annahmen in den obigen Code aufrufen:

  • Bewegen Sie den Code, der XML-Serialisierung in eine separate Baugruppe
  • Für diese Baugruppe verwendet:
  • hinzufügen Project Bezug auf die obige Anordnung aus dem Erweiterungspaket
  • hinzufügen Browse.. Bezug auf die eingebauten Serialisierungsassembly aus dem Erweiterungspaket
+0

Dieser Code funktioniert wunderbar (mit dem Zusatz von "+". Dll "') - vielen Dank! Ich habe eine Frage: Warum sagen Sie "Wenn Sie bereits eine ** signierte ** Serialisierungs-Assembly erstellen und bereitstellen" - macht das Signieren der Assembly einen Unterschied? Es scheint alles ohne zu funktionieren ... – RichieHindle

+0

Habe diesen Bug raus :). Mit VS 15 habe ich "eine stark benannte Assembly benötigt" wenn die SGEN Assembly nicht signiert wurde. Der Build-Prozess signiert die SGEN-Assembly wahrscheinlich automatisch für Sie. –

+0

Ich erstelle gerade die Assembly, indem ich sgen manuell ausführe, so dass keine explizite Signierung stattfindet. Keine Sorge - ich kann es trotzdem immer unterschreiben, nur für den Fall. (Wenn es Ihnen nichts ausmacht, wie wurde das "eine stark benannte Assembly erforderlich ist" Fehler angezeigt? Eine Ausnahme von Assembly.LoadFrom() oder etwas anderes?) – RichieHindle

Verwandte Themen