Ich fusioniere mehrere .NET-Assemblys mit ILMerge, einschließlich einiger Assemblys von Drittanbietern. Seitdem habe ich mehrere Fehler erlebt, die alle darauf zurückzuführen sind, dass Typdefinitionen an die Assembly gebunden sind, in der sie definiert sind.
Ein einfaches Beispiel ist die Definition des log4net-Konfigurationsabschnitts in meiner App.config. Es verwendet type="log4net.Config.Log4NetConfigurationSectionHandler, log4net", was nicht funktionieren wird, da die log4net-Assembly nicht mehr existiert, nachdem sie in meine fusionierte Assembly zusammengeführt wurde. Aber das ist kein großes Problem, ich ändere einfach den Assemblynamen auf meine fusionierte Assembly und es funktioniert einwandfrei.
Ein etwas komplizierteres Beispiel sind binär serialisierte Typen. Mein System verwendet die binäre Serialisierung, um bestimmte Objekte zwischen Prozessen zu senden. Alle serialisierbaren Objekte sind in einer gemeinsamen Assembly definiert, auf die alle anderen Projekte verweisen. Ich habe die Standard-Binärserialisierung verwendet, aber sie begann zu versagen, als die Objekte deserialisiert wurden, mit dem Fehler, dass die zusammengeführte Assembly, die das Objekt serialisiert hat, nicht gefunden werden konnte. Auch hier kein großes Problem, ich habe einen benutzerdefinierten SerializationBinder implementiert, der nach dem Typ in einer beliebigen geladenen Assembly sucht, nicht nur in der angegebenen.
Das vorherige Beispiel wurde komplizierter, als der serialisierte Typ auf andere serialisierbare Typen verweist. Ich stoße weiterhin auf mehr und mehr Probleme, die immer schwieriger zu bewältigen sind.
Der Punkt, den ich hier machen möchte, ist, dass das .NET-Typsystem und ILMerge scheinbar nicht gut miteinander funktionieren. Hat jemand Erfahrung damit, wie sie dieses Problem gelöst haben? Ist es möglich, dem .NET-Runtime mitzuteilen, dass es nicht wichtig ist, in welcher Assembly der Typ sein sollte, einfach überall danach suchen?
HINWEIS: Bitte antworten Sie nicht mit der Frage, warum ich Assemblys zusammenführe, das ist nicht der Sinn dieser Frage.
0 Stimmen
WAG: Hast du den DataContractSerializer schon ausprobiert? Du wirst es nicht können mit dem NetDataContractSerializer, da er an Typen gebunden ist, aber der einfache DataContractSerializer sollte für dich funktionieren...