Hi,
ich habe gerade ein Problem bezüglich einer fertigen WPF-Anwendung die ich kompiliert habe.
Im bin Ordner finden sich eine ganze Reihe von Dateien wieder:
MyProject.exe
MyProject.pdb
MyProject.vshost.exe
MyProject.vshost.exe.manifest
WPFToolkit.dll
WPFToolkit.pdb
Außerdem noch eine .xml Datei die ich eigentlich in das Projekt mit eingebunden hatte.
Nun läuft die Anwendung nicht wenn ich die .exe allein herauskopiere. Ich habe verschiedenes getestet. Mindestes die WPFToolkit.dll und meine XML-Datei müssen im selben Verzeichnis sein, damit das Programm überhaupt startet. (Brauche ich den Rest dann überhaupt mit verteilen, wenn ich das Programm weitergebe?)
Kann ich das Ganze außerdem irgendwie so lösen, dass alles nötige bereits in der .exe steckt und diese allein läuft? Zumindest meine XML-Datei die ich ins Projekt eingebunden habe. Bei der .dll befürchte ich, dass es garnicht klappt.
Gruß Roper
Lösung:Beides als Resource einbinden und von da auch laden.
Für die dll musst Assembly.Load(byte[]) am anfang verwenden. Evl. musst du eine 2. exe schreiben, die die eigentliche exe und die dll als resource hat. gehen tuts aber auf jeden fall!
@Floste:
Ok danke. Aber wie binde ich die beiden ein? Ist das nur eine Einstellung?
Die XML-Datei habe ich gemäß dem Vorschlag HIER als "Inhalt" und "Immer kopieren" festgelegt. Wenn ich es in "Ressource" ändere will mein Programm nicht mehr starten!?
@Ploetzi:
Damit habe ich mich bisher nie befasst. Bietet Visual Studio da Optionen oder geht das nur über zusätzliche Software?
Hi,
ja du benötigst deine exe + Toolkit und evtl die xml Datei.
Du kannst die Toolkit dll in die Exe rein-mergen.
Wenn du dann das Problem mit der XML Datei behoben hast bleibt dir nur eine deine exe übrig.
Chris
Du kannst mit .NETZ alle deine dlls zu der exe hinzufügen lassen.
Das mit der XML-Datei wirst du jedoch anders lösen müssen.
Wenn sie in der exe drin ist, kannst du sie nicht mehr verändern.
Da du vermultich irgendwelche Konfigurationen in diese rein schreibst und rausliest, brauchst du nur noch eine Standardkonfiguration.
Dass man die Datei löscht, kann immer mal passieren.
mfg
SeeQuark
Die XML-Datei kann ich wenn nötig auch komplett lassen. Meine Anwendung liest Abläufe aus XML Dateien aus und es gibt einen Startablauf der gleich geladen werden soll. Deshalb habe ich eine XML-Datei zum Projekt hinzufügen wollen..
Wie funktioniert das mit der WPFToolkit.dll? Kann ich beim Verweis auf diese irgendwie angeben, dass sie mit integriert werden soll. Oder brauche ich zusätzliche Software wie dieses .NETZ?
Kann ich beim Verweis auf diese irgendwie angeben, dass sie mit integriert werden soll.
Du könntest sie zwar als Resource in der exe halten und nur über Reflection darauf zugreifen (s. Floste), aber mehr geht imho nicht.
Die Möglichkeiten wurden eigentlich ja schon alle genannt.1.Installer: Installier dein Programm und entpackte die verschiedenen Dateien.
1..NETZ: Packt die dll's und die exe als zu einem File zusammen.
1.So lassen: Lass die Dateien so wie sie sind oder und/oder füge sie zu einem (ev. selbstentpackenden) Archiv hinzu.
Wenn es nur um das Toolkit geht, kannst du es ja auch den Hinweis geben, dass man es selber runterladen soll.
1.**Reflection:**Das ist eher eine theoretische Lösung -> nicht zu empfehlen.
Ich hoffe, ich habe nichts vergessen.
Such dir was aus 🙂
EDIT: Ach so, die Dateien MyProject.pdb, MyProject.vshost.exe, MyProject.vshost.exe.manifest und WPFToolkit.pdb kannst du ohne Probleme weglassen.
mfg
SeeQuark
EDIT: Ach so, die Dateien MyProject.pdb, MyProject.vshost.exe, MyProject.vshost.exe.manifest und WPFToolkit.pdb kannst du ohne Probleme weglassen.
Ok danke, das war mir noch wichtig das zu wissen.
EDIT: Für meine .xml Datei gibt es noch ein Problem: Wenn ich sie als Resource angebe wird sie zwar mit in die .exe hineinkompiliert, allerdings lässt sich diese dann nicht starten.
Hi,
wie lädst du denn die XML-Datei?
Wenn du Sie bisher von der Platte geladen hast (über ne direkte Pfadangabe), musst du das jetzt natürlich anders machen, da die XML Datei nicht mehr auf der Festplatte liegt, sondern in die EXE-Datei integriert ist.
Das wäre z.B. so möglich (über Angabe des assemblyNames, also dem Namen der EXE-Datei, und den Dateinamen der eingebetteten XML-Datei):
public static Stream GetEmbeddedFile(string assemblyName,
string fileName)
{
try
{
Assembly a = Assembly.Load(assemblyName);
Stream str = a.GetManifestResourceStream(assemblyName + "." + fileName);
if (str == null)
{
throw new Exception(string.Format("Could not locate embedded resource '{0}' in assembly '{1}'",
fileName,
assemblyName));
}
return str;
}
catch (Exception e)
{
throw new Exception(assemblyName + ": " + e.Message);
}
}
Mfg,
Daniel
Die XML-DAtei habe ich gemäß diesem Vorschlag HIER als "Inhalt" und "Immer kopieren" angegeben. Ich kann im Projekt also einfach nur per Name der Datei (in meinem Fall start.xml) darauf zugreifen.
Was muss ich hier einstellen damit ich es gemäß deinem Vorschlag umsetzen kann und vorallem: Kann ich es so einbinden dass es weitern einfach per Name klappt und trotzdem alles in der .exe steckt?