none
Einer .exe ein Icon geben/verändern RRS feed

  • 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
    Dienstag, 21. Juni 2011 19:01

Antworten

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

    Dienstag, 21. Juni 2011 21:44
    Beantworter
  • thx, teste ich mal :)

     

    mfg


    Hoi
    Dienstag, 21. Juni 2011 22:30
  • 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
    Mittwoch, 22. Juni 2011 11:23
  • Hi,
        .CompilerOptions = ("/target:winexe" & " " & "/win32icon:") + "C:\Apps-preferences-plugin-script.ico"
    
    Wo liegt der Fehler? Verstehe da nicht, wieso es nicht funzt...

    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
    Mittwoch, 22. Juni 2011 12:04
    Moderator
  • Doppelklich auf die exe und sofort kommt die meldung, das die anwendung nicht reagiert. Es kommt nicht mal das Fenster, das kommen sollte...

    Ich verstehe einfach nicht, wieso...


    Hoi
    Mittwoch, 22. Juni 2011 16:24
  • 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 Prozesse

    Wenn Du gar nicht weiterkommst, zeige den verwendeten Code oder stelle ihn
    zum Download bereit.

    Gruß Elmar

    Mittwoch, 22. Juni 2011 22:32
    Beantworter
  • 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
    Donnerstag, 23. Juni 2011 11:50
  • 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) Anwendung

    Dann 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

     

    Freitag, 24. Juni 2011 13:06
    Beantworter
  • 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
    Freitag, 24. Juni 2011 19:23