Benutzer mit den meisten Antworten
Einer .exe ein Icon geben/verändern

Frage
-
Hi,
Ich habe mir einen Multi-Editor gemacht, um damit Richtige Programme erstellen zu können. Jedoch wird das Standart-Icon angezeigt. Nun möchte ich dies ändern. Ich verwende System.CodeDom.Compiler, Microsoft.CSharp und System.Reflection. Mein zurzeitiger Code, womit ich die Programme erstelle:
'txtApplicationName = Pfad & "\Projekt.exe" 'txtMainClass = "Main" If Me.txtApplicationName.TextLength = 0 Then MessageBox.Show("Der Anwendungsname darf nicht leer sein!", _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Return ElseIf Me.txtMainClassName.TextLength = 0 Then MessageBox.Show("Der Name der Hauptklasse darf nicht leer sein!", _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Return End If ' Je nach Einstellung für VB .NET oder C# kompilieren. Dim cdp As CodeDomProvider If txtSprache.Text = "vb" Then cdp = New VBCodeProvider() ElseIf txtSprache.Text = "c#" Then cdp = New CSharpCodeProvider() End If ' Konfigurieren des Compilers. Dim compiler As ICodeCompiler = cdp.CreateCompiler() Dim cpParameters As CompilerParameters = New CompilerParameters() With cpParameters .GenerateExecutable = True .OutputAssembly = Me.txtApplicationName.Text .MainClass = Me.txtMainClassName.Text .IncludeDebugInformation = CheckBox1.Checked ' Verfügbare Assemblies hinzufügen. Für unsere einfache ' Anwendung sollte dies ausreichend sein. Dim asm As [Assembly] For Each asm In AppDomain.CurrentDomain.GetAssemblies() .ReferencedAssemblies.Add(asm.Location) Next asm End With RichTextBox2.Text = TextBox3.Text & vbCrLf & TextBox4.Text & vbCrLf & TextBox5.Text & vbCrLf ' Kompilieren der Assembly. Dim strCode As String = Me.RichTextBox2.Text & Me.CodeEditorControl1.Document.Text Dim cr As CompilerResults = _ compiler.CompileAssemblyFromSource(cpParameters, strCode) If cr.Errors.Count > 0 Then Dim strErrors As String = _ "Kompilierung ist fehlgeschlagen" & ControlChars.NewLine Dim cerr As CompilerError For Each cerr In cr.Errors strErrors &= ControlChars.NewLine & cerr.ToString() Next cerr MessageBox.Show(strErrors, _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Return End If ' Kompilierung war erfolgreich, versuche die erstellte Anwendung ' auszuführen. Try If Not System.IO.File.Exists(Me.txtApplicationName.Text) Then MessageBox.Show( _ String.Format("Die Datei ""{0}"" kann nicht gefunden " & _ "und daher auch nicht ausgeführt werden!", _ Me.txtApplicationName.Text), _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Return End If Dim psi As ProcessStartInfo = _ New ProcessStartInfo(Me.txtApplicationName.Text) Process.Start(psi) Catch ex As Exception MessageBox.Show( _ String.Format("Fehler beim Ausführen von ""{0}""!", _ Me.txtApplicationName.Text), _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) End Try
Wo muss ich nun was einbauen, damit meine .exe ein Symbol und ein "Image"(wenn das fenster dann offen ist) hat? man hat mir in anderen Foren gesagt, das ich API studieren sollte, jedoch verstehe ich mich damit überhaupt nicht...
Gruss
gfcwfzkm
Hoi
Antworten
-
Hallo,
der Code scheint weitgehend entnommen aus: http://www.activevb.de/tipps/vbnettipps/tipp0033.html
Und ich hoffe Du hast verstanden, was dort passiert.Sowohl der VB-Compiler wie der C# Compiler kennen die Option /win32icon
für das Einbetten eines Icons.In dem Beitrag Compile an exe with icon wird erläutert,
wie man die Option über die CompilerOptions mitgeben kann.
Beachte dort auch die Erläuterungen zur Pfadangabe -
am besten legst/kopierst Du die Icon-Datei in das Verzeichnis mit den Quelldateien.Gruß Elmar
- Als Antwort markiert Thorsten DörflerModerator Mittwoch, 22. Juni 2011 05:20
Alle Antworten
-
Hallo,
der Code scheint weitgehend entnommen aus: http://www.activevb.de/tipps/vbnettipps/tipp0033.html
Und ich hoffe Du hast verstanden, was dort passiert.Sowohl der VB-Compiler wie der C# Compiler kennen die Option /win32icon
für das Einbetten eines Icons.In dem Beitrag Compile an exe with icon wird erläutert,
wie man die Option über die CompilerOptions mitgeben kann.
Beachte dort auch die Erläuterungen zur Pfadangabe -
am besten legst/kopierst Du die Icon-Datei in das Verzeichnis mit den Quelldateien.Gruß Elmar
- Als Antwort markiert Thorsten DörflerModerator Mittwoch, 22. Juni 2011 05:20
-
Problem, es funktioniert nur teilweise.
Es hat zwar ein icon, aber es Funktioniert nicht mehr. Also die erstelle .exe ragiert nicht mehr, und am code liegt's nicht, womit ich die .exe gemacht habe...
Dim cdp As CodeDomProvider If txtSprache.Text = "vb" Then cdp = New VBCodeProvider() ElseIf txtSprache.Text = "c#" Then cdp = New CSharpCodeProvider() End If ' Konfigurieren des Compilers. Dim compiler As ICodeCompiler = cdp.CreateCompiler() Dim cpParameters As CompilerParameters = New CompilerParameters() With cpParameters .CompilerOptions = ("/target:winexe" & " " & "/win32icon:") + "C:\Apps-preferences-plugin-script.ico" .GenerateExecutable = True .OutputAssembly = Me.txtApplicationName.Text .MainClass = Me.txtMainClassName.Text .IncludeDebugInformation = CheckBox1.Checked
Wo liegt der Fehler? Verstehe da nicht, wieso es nicht funzt...
Hoi -
Hi,
.CompilerOptions = ("/target:winexe" & " " & "/win32icon:") + "C:\Apps-preferences-plugin-script.ico"
warum solch ein komisches Konstrukt?
.CompilerOptions = "/target:winexe /win32icon:C:\Apps-preferences-plugin-script.ico"
würde es auch tun.
Was heißt "reagiert nicht mehr"? Startet die Anwendung und ist dann eingefroren?
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo,
das können wir leider auch nicht..
Denn wir wissen nicht welchen Code Du da übersetzt.
Wenn beim Kompilieren kein Fehler auftritt und die Anwendung (Exe) erstellt wird,
so heißt das nur das syntaktisch alles in Ordnung ist.
(Und das Icon wiederum sollte dabei überhaupt keine Rolle spielen)Du solltest den Code, den Du mit Deinem selbstgestrickten Compiler übersetzt,
mal mit Visual Studio übersetzen und mit dem Debugger durgehen.
Wenn Du eine Visual Studio Version (nicht Express) hast, kannst Du Dich auch
an den Prozess einklinken, siehe Anhängen an laufende ProzesseWenn Du gar nicht weiterkommst, zeige den verwendeten Code oder stelle ihn
zum Download bereit.Gruß Elmar
-
Ich zeig ihn. Also, Code zum erstellen der .exe:
Verwende VB2010 Express
Try Call Speichern() Catch ex As Exception End Try 'Shell("copy " & TextBox6.Text & " " & My.Settings.speichern & "Multi-Editor\" + Label6.Text + "\") If Me.txtApplicationName.TextLength = 0 Then MessageBox.Show("Der Anwendungsname darf nicht leer sein!", _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Return ElseIf Me.txtMainClassName.TextLength = 0 Then MessageBox.Show("Der Name der Hauptklasse darf nicht leer sein!", _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Return End If ' Je nach Einstellung für VB .NET oder C# kompilieren. Dim cdp As CodeDomProvider If txtSprache.Text = "vb" Then cdp = New VBCodeProvider() ElseIf txtSprache.Text = "c#" Then cdp = New CSharpCodeProvider() End If ' Konfigurieren des Compilers. Dim compiler As ICodeCompiler = cdp.CreateCompiler() Dim cpParameters As CompilerParameters = New CompilerParameters() With cpParameters .CompilerOptions = "/target:winexe /win32icon:C:\Apps-preferences-plugin-script.ico" .GenerateExecutable = True .OutputAssembly = Me.txtApplicationName.Text .MainClass = Me.txtMainClassName.Text .IncludeDebugInformation = CheckBox1.Checked Try If Picture = "1" Then Else End If Catch MsgBox("Icon wurde leider nicht gefunden, komplimierung wird fortgesetzt" & vbCrLf & "Standart-Icon wird eingefügt", MessageBoxIcon.Exclamation, "ERROR") End Try ' Verfügbare Assemblies hinzufügen. Für unsere einfache ' Anwendung sollte dies ausreichend sein. Dim asm As [Assembly] For Each asm In AppDomain.CurrentDomain.GetAssemblies() .ReferencedAssemblies.Add(asm.Location) Next asm End With RichTextBox2.Text = TextBox3.Text & vbCrLf & TextBox4.Text & vbCrLf & TextBox5.Text & vbCrLf ' Kompilieren der Assembly. Dim strCode As String = Me.RichTextBox2.Text & Me.CodeEditorControl1.Document.Text Dim cr As CompilerResults = _ compiler.CompileAssemblyFromSource(cpParameters, strCode) If cr.Errors.Count > 0 Then Dim strErrors As String = _ "Kompilierung ist fehlgeschlagen" & ControlChars.NewLine Dim cerr As CompilerError For Each cerr In cr.Errors strErrors &= ControlChars.NewLine & cerr.ToString() Next cerr MessageBox.Show(strErrors, _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Return End If ' Kompilierung war erfolgreich, versuche die erstellte Anwendung ' auszuführen. Try If Not System.IO.File.Exists(Me.txtApplicationName.Text) Then MessageBox.Show( _ String.Format("Die Datei ""{0}"" kann nicht gefunden " & _ "und daher auch nicht ausgeführt werden!", _ Me.txtApplicationName.Text), _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) Return End If Dim psi As ProcessStartInfo = _ New ProcessStartInfo(Me.txtApplicationName.Text) Process.Start(psi) Catch ex As Exception MessageBox.Show( _ String.Format("Fehler beim Ausführen von ""{0}""!", _ Me.txtApplicationName.Text), _ Application.ProductName, _ MessageBoxButtons.OK, _ MessageBoxIcon.Exclamation) End Try End If
Und nun der Code, den ich debugen will:
Option Explicit On Option Strict On Option Compare Binary #Region "Imports" Imports System.Windows.Forms Imports System Imports System.Diagnostics #End Region Public Class Main Public Shared Sub Main() Console.Title = "ConsoleApplication" Console.WriteLine("Hello World!") MessageBox.Show("Hello World!") End Sub End Class
Das wäre das wichtige...
Könnt ihr mir weiterhelfen?
mfg
Hoi -
Hallo Hoi.
entschuldige ich habe den Thread aus den Augen verlogen.
Um mit Deinem Code etwas anfangen können, müsste man einiges nachrüsten, da fehlt etwas die Zeit.
Ich habe das Ganze deswegen hilfsweise mit Visual Studio nachgestellt.
Dein Beispiel Programm ist eine Mischung aus Konsolen-Anwendung und Windows Forms Anwendung.
Und in einer Konsolenanwendung hat ein MessageBox.Show (oder auch MsgBox) eigentlich nichts verloren.Die /target Option gibt wiederum an, welche Ausgabe erfolgt.
Bisher wurde dabei im Standard eine "Exe" (Konsolenanwendung) erzeugt.
Da Du jetzt die Option "/target:winexe" hinzufügst, ändert sich es in eine Windows (Forms) AnwendungDann wiederum ist Console.Title nicht mehr gültig und bei Console.Title = "ConsoleApplication" gibt es eine Ausnahme.
Entweder Du lässt die Option weg (bzw. machst sie einstellbar) oder schreibst den Schnipsel entsprechend um.
Gruß Elmar
-
Ich werde mal versuchen, das umzuschreiben.
Noch eine kleine, (vielleicht letzt) frage...
Ich zerbreche mir zurzeit den Kopf, Ein Label, ein button und eine Textbox hinzuzufügen und das per Code.
Hab idee gehabt, dies aus einem anderen, VB-Projekt aus dem .Designer.vb zu nehmen, klappt aber nicht, wie erwartet...Wie kann ich diese komponenten hinzufügen?
gruss gfc
Hoi