Frage

Ich entwickle in Windows 7 64-Bit mit Visual Studio 2008.Ich habe eine Sammlung von Klassenbibliotheken, die ich mit ILMerge zu einer einzigen DLL zusammenführe.Wenn ich jedoch versuche, diese zusammengeführte DLL zu verwenden, wird Folgendes angezeigt:

[BadImageFormatException:Die Datei oder Assembly „MyMergedDll“ oder eine ihrer Abhängigkeiten konnte nicht geladen werden.Es wurde versucht, ein Programm mit einem falschen Format zu laden.]

Ich habe nach Hilfe gesucht und es sah so aus, als müsste ich die Build-Eigenschaft in jedem Projekt in MyMergedDll auf x86 festlegen, also habe ich das getan.Außerdem habe ich alle Nicht-MSTest-Projekte im Webdienst, in dem ich auf MyMergedDll verweise, auf x86 als Ziel festgelegt.Ich erhalte jedoch immer noch diesen Fehler.

Wenn dieser Blogeintrag Es ist zu glauben, dass ich diesen Fehler erhalten kann, wenn ich Folgendes tue:

public class SpecificClass: BaseClass: where T : class { }

Das heißt, es gibt eine Klassenbeschränkung für ein Generikum.Der Blogeintrag stammt allerdings aus dem Jahr 2007, daher weiß ich nicht, ob das noch zutrifft.Bevor ich jede generische Klasse in meinen Projekten aufspüre, um Einschränkungen zu überprüfen, möchte ich von StackOverflow einige Informationen dazu erhalten, was Ihrer Meinung nach das Problem ist.

Wenn es darauf ankommt, ist MyMergedDll mit einem starken Namen signiert.Ich versuche, MyMergedDll sowohl in einer Konsolenanwendung als auch in einem Webdienst zu verwenden.Ich weiß nicht, ob es möglicherweise komplizierter wird, ob IIS jedes Mal aktualisiert wird, wenn ich den Webdienst neu aufbaue.Mit der Konsolenanwendung bekomme ich anscheinend nur das BadImageFormatException wenn ich im Release-Modus baue.

War es hilfreich?

Lösung

Ich habe es zum Laufen gebracht und ich glaube, das lag daran, dass ich zwei Dinge getan habe:

  1. MyMergedDLL wurde mit einigen anderen Assemblys erstellt, über die ich die Kontrolle habe, aber diese Assemblys waren nicht auf x86 als Ziel eingestellt.Ich habe diese Assemblys für x86 neu erstellt, die Assemblys, aus denen MyMergedDLL besteht, neu erstellt und diese Assemblys erneut zusammengeführt, um eine neue Kopie von MyMergedDLL zu bilden.
  2. Die Konsolenanwendung, die MyMergedDLL verwendet, wurde im Debug-Modus, aber nicht im Release-Modus auf x86 als Ziel eingestellt, weshalb sie im Debug-Modus funktionieren würde, aber das geben würde BadImageFormatException im Release-Modus.

Das Erste wäre vielleicht nicht nötig gewesen.Ich glaube, ich brauchte nur den Verbraucher von MyMergedDLL, um auch im Release-Modus auf x86 abzuzielen.Ich konnte nie herausfinden, welche Version von ILMerge ich verwendete, also habe ich es einfach mit dem neuesten MSI neu installiert, das ich auf der Microsoft-Website finden konnte.

Andere Tipps

Haben Sie die von Ihnen verwendete Version von ILMerge noch einmal überprüft?

Ich frage, weil eine alte, falsche Version von aspnet_merge (die im Grunde unter anderem die gleiche Zusammenführung von DLLs durchführt) bei uns die gleichen Probleme verursacht hat, die Sie beschreiben.Ich bin bei der Beantwortung etwas ins Detail gegangen Das Frage an jemand anderen zu SO.

Es könnte sich lohnen, einen kurzen Blick auf die DLL in ILDASM zu werfen (Reflector neigt dazu, umzufallen, wenn man versucht, diese fehlerhaften DLLs zu dekompilieren – was vielleicht nicht überraschend ist) und zu sehen, ob Sie den Grund der Beschädigung erkennen können und was sie in Ihrem Code bedeutet es könnte Aufschluss über das Problem geben.

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