2017-11-02 6 views
-2

Ich versuche, ein Programm zu machen, das nur eine einzige EXE-Datei hat. Das ist eine Voraussetzung.Erstellen Sie Datei mit FileOptions.DeleteOnClose, schreiben Sie darauf und sehen, dass es gelöscht wird nach

Aber ich muss auch Hilfe für dieses Programm implementieren, damit der Benutzer wissen kann, was was macht. Ich beschloss, eine chm-Datei zu erstellen und einen HelpProvider zu verwenden. Anfangs dachte ich, ich wäre in der Lage, die chm-Datei einzubetten und dem HelpProvider mitzuteilen, sie aus der resources.resx zu öffnen.

Nun, das hat nicht funktioniert.

Da ich keine anderen Optionen kenne, um Hilfe anzuzeigen, ohne dem Programm weitere Dateien hinzuzufügen oder Online-Hosting oder ähnliches zu verwenden, habe ich beschlossen, das eingebettete chm auf die Festplatte zu schreiben (wenn der Benutzer es öffnet)) und lösche es nachher (nachdem ich einen Weg gefunden hatte, dies im Speicher zu tun).

Das Problem besteht darin, die Datei mit dem FileOptions.DeleteOnClose Flag zu erstellen und darauf zu schreiben. Wenn ich

File.Create(path, 100, FileOptions.DeleteOnClose); 
File.WriteAllBytes(path, mychm); 

Die Datei wird von der Create Methode gesperrt. Wenn ich using auf die Create Methode setzen, wird die Datei vor dem Schreiben gelöscht.

+0

'File.Create' gibt Ihnen einen' FileStream'. Benutze das nur zum Schreiben und behalte es in einem Feld, so dass der fragliche Stream keine Müllsammlung bekommt. Entsage es explizit, wenn du damit fertig bist. –

+2

Es wird nicht fliegen. Ein Programm (wie hh.exe, der Hilfe-Viewer) muss diese Datei mit FileShare.Write und FileShare.Delete öffnen und das wird es nicht tun. Um Hilfe mit solchen unrealistischen Anforderungen zu bitten, ist nicht nützlich. –

+0

Warum sollten Sie anstatt Hilfedatei erstellen und löschen ein anderes Projekt mit Hilfe erstellen und es in Ihre exe wie hier beschrieben: https://stackoverflow.com/questions/10137937/merge-dll-into-exe. – Nick

Antwort

1

Okay, also muss der Code eine einzige .exe sein. Meinetwegen.

Haben Sie darüber nachgedacht, dass Ihre Anwendung diejenige ist, die die Hilfe anzeigt? Ich meine, ich weiß nicht, was die Anforderungen an die Hilfe eigentlich sind (Clickable Indexes? Inhaltsverzeichnis? Tool Tips? Etc) - aber je nachdem wie benutzerfreundlich du es machen musst, könntest du immer einfach hinzufügen ein Windows-Formular mit einem WebBrowser-Objekt und injizieren HTML-Inhalte direkt in den Webbrowser (über myWebBrowserControl.Document).

Ich meine, das ist auf keinen Fall optimal. Aber es ist eine schnell und schmutzig Lösung für die Anforderung "Help-Enabled-Anwendung mit nur einer einzigen .exe-Ausgabe".

EDIT: Zusätzliche Idee. Wenn Sie dies für den internen Gebrauch in einem Unternehmen schreiben, können Sie die Hilfedatei an einem zugänglichen Ort im Unternehmensnetzwerk ablegen - und Ihre App mit dem Remote-Standort verknüpfen. Auf der anderen Seite können Sie, wenn Sie eine App entwickeln, die von Benutzern heruntergeladen wird, eine Online-Hilfe entwickeln und die App mit der URL Ihrer Hilfe verknüpfen.

+0

Das ist eine gute Idee, ich dachte nur, es wäre viel einfacher zu mach es mit HelpProvider und chm. –

+0

Du hast wahrscheinlich Recht - CHM würde es viel einfacher machen ... aber nach den Spielereien musstest du mit 'nur einer Datei' durchgehen, ich bin mir nicht sicher, ob es das wert ist. Schauen Sie sich auch die Ideen zu meiner Bearbeitung an - wenn eine von ihnen machbar ist, sind sie bessere Lösungen als meine Originale (ich weiß einfach nicht, ob sie in Ihrer Arbeitsumgebung technisch machbar sind.) – Kevin

Verwandte Themen