Frage

Ich habe eine ASP.NET-Anwendung auf einem Remote-Web-Server ausgeführt wird, und ich habe gerade angefangen diesen Fehler:

Method not found: 'Void System.Collections.Generic.ICollection`1..ctor()'.

zerlegt ich den Code in der DLL und es scheint, wie die Compiler falsch den Code zu optimieren. (Beachten Sie, dass Set eine Klasse, die eine Reihe von einzigartigen Objekten implementiert Aus IEnumerable erbt..) Diese Zeile:

Set<int> set = new Set<int>();

in dieser Zeile zusammengestellt:

Set<int> set = (Set<int>) new ICollection<CalendarModule>();

Die CalendarModule Klasse ist eine völlig unabhängige Klasse !! Hat jemand schon einmal, wie dies vor .NET falsch kompiliert Code bemerkt?

Update # 1: Dieses Problem scheint von Microsoft eingeführt werden ILMerge Werkzeug. Wir sind derzeit untersucht, wie es zu überwinden.

Update # 2: Wir haben zwei Möglichkeiten, dieses Problem zu lösen, so weit. Wir verstehen nicht ganz, was das zugrunde liegende Problem ist, aber diese beiden fixieren:

  1. Ausschalten Optimierung.

  2. die assemblie mit ILMerge auf einer anderen Maschine zusammenführen.

So wir fragen, links, wenn die Build-Maschine irgendwie falsch konfiguriert ist (was angesichts seltsam ist, dass wir die Maschine unter Verwendung von Veröffentlichungen zu bauen seit mehr als ein Jahr), oder wenn es ein anderes Problem.

War es hilfreich?

Lösung

Ahh, ILMerge -, dass zusätzliche Informationen in Ihrer Frage wirklich mit Ihrem Problem helfen. Obwohl ich nicht immer die .net-Compiler auf diese Weise scheitern erwarten würde ich gelegentlich diese Art der Sache erwarten kann zu sehen, mit ILMerge (gegeben, was es tut).

Meine Vermutung ist, dass zwei Ihrer Baugruppen die gleiche Optimierung ‚Trick‘ verwenden und einmal merged bekommen Sie den Konflikt.

Haben Sie den Fehler mit Microsoft erhöht?

Eine Abhilfe ist in der Zwischenzeit die Baugruppen von der Quelle als eine einzige Baugruppe neu zu kompilieren, wodurch die Notwendigkeit für ILMerge speichern. Da die csproj Dateien nur XML-Listen sind sind sie im Grunde einfach zu verschmelzen, und man konnte, dass als zusätzlichen MSBuild Schritt automatisieren.

Andere Tipps

Sind Sie sicher, dass der Montag Sie befinden sich in der tatsächlich aus dem Quellcode in Frage erzeugt? Sind Sie in der Lage, dieses Problem mit einem kleinen Testfall zu reproduzieren?

Edit: , wenn Sie Reflektor verwenden, ist es möglich, dass die MSIL zu C # Umwandlung nicht korrekt ist - Reflektor ist nicht immer 100% bei decompiling genau. Wie sieht die MSIL aussehen?

Bearbeiten. 2: Hmm ... Ich habe erkannt, dass es nicht Reflector defekt sein kann oder würden Sie nicht, dass die Fehlermeldung zur Laufzeit bekommen haben

Dies ist eher ein Problem mit der Reflexion Werkzeug sein, als mit dem .Net Kompilierung. Der Fehler Sie bekommen - ein Konstruktor nicht während Remote gefunden ist höchstwahrscheinlich eine Serialisierung Ausgabe (alle serialisable Klassen brauchen einen parameterlosen Konstruktor)

sein.

Der Code von Ihrem Reflexion Werkzeug gefunden ist eher eine Ausnahme Typumwandlung werfen.

Ich bin damit einverstanden sowohl mit Curt und Betten; das klingt wie etwas falsch ist. Der Optimierer hat für uns alle gearbeitet und keine solchen Fehler berichtet (die ich kenne) - könnte es sein, dass Sie in der Tat, etwas falsch zu machen

Nebenbei bemerkt:. Ich würde auch darauf hinweisen System.Collections.Generic.HashSet<T> wie die in .Net fx ist 3.5 und tut genau das, was eine Set<> Klasse sollte

Wurde Code vor kurzem auf diesen Server bereitgestellt? Könnte jemand einen Build ohne Ihr Wissen geschoben haben? Können Sie zu Quellcodeverwaltung gehen, die neuesten ziehen, und das Problem duplizieren?

An diesem Punkt mit den gegebenen Informationen, bezweifle ich, es ist der Compiler.

Ouch. Wenn dies wirklich ILMerge Schuld ist, halten Sie bitte dieses Thema up-to-date mit Ihren Erkenntnissen. - Ich ILMerge als Schlüsselschritt der Verwendung in einer COM-Interop-Assembly Konstruktion

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top