2012-01-18 10 views
16

è possibile impostare l'icona dell'applicazione nelle proprietà del progetto. Se lo fai, l'exe avrà questa icona al posto di quella predefinita. questa icona è un Win32 risorse e si può accedere anche in questo modo:Aggiunta di più icone (Win32-Resource) all'applicazione .NET

change icon

voglio avere icone speciali per i tipi di file che vengono utilizzati dal mio programma. per associare un'icona filetype posso specificarla nel registro ("MyProg.exe, 1" nella chiave "DefaultIcon").

so come AGGIUNGI ALTRE icone all'assembly che posso utilizzare per l'associazione di tipo file?

vi ringrazio molto

ps: si tratta di un WPF Application (.NET 4.0)

risposta

15

Windows non sa nulla di risorse gestite, è necessario aggiungere risorse non gestite al file eseguibile. Nello screenshot di parapura, è necessario selezionare il pulsante di opzione . Ciò richiede un file .res, un file binario che viene creato eseguendo lo strumento rc.exe di Windows SDK su un file .rc. Il file RC è un semplice file di testo che contiene le dichiarazioni di risorsa, in modo simile a questo:

1 ICON "mainicon.ico" 
2 ICON "alternative1.ico" 
3 ICON "alternative2.ico" 
1 24 "app.manifest" 

essere sicuri di salvare il file nella cartella di progetto senza codifica UTF-8, utilizzando il blocco note è la cosa migliore. Creare il file app.manifest richiesto con Project + Aggiungi nuovo elemento, file manifest dell'applicazione. Aggiungi questo file .rc al tuo progetto con Project + Aggiungi elemento esistente. Fare doppio clic su di esso e verificare che sia possibile visualizzare le icone e il manifest. Fare clic con il tasto destro del mouse sul nodo superiore, Aggiungi risorsa e fare clic su Versione + Nuovo. Modificare le informazioni sulla versione, fate attenzione che si abbinerà più automaticamente gli attributi in AssemblyInfo.cs

È possibile compilare il file RC in un file res con il prompt dei comandi Studio vista:

rc /r something.rc 

Quale produce il file .res che è possibile utilizzare nella scheda delle proprietà del progetto. Questo è un evento pre-build consigliabile ma un po 'difficile da ottenere. Il numero di modi in cui questo può andare storto sono numerosi, buona fortuna.

+0

risolto. ma ho usato [ResEdit] (http://www.resedit.net/) per creare il file rc/res. funziona perfettamente – 0xDEADBEEF

+0

O semplicemente distribuisci una DLL nativa che contiene tali risorse con l'applicazione, in modo da non dover eseguire strumenti personalizzati o perdere informazioni sulla versione. –

+0

Questo approccio perde le informazioni sulla versione del file e, se lo ripristini (ad esempio utilizzando il file .rc in stile di versione C++), il problema con il gestore di attività/il titolo dell'applicazione è ancora errato. (Vedi la mia soluzione e aggiornalo alla fine.) Quindi usa InsertIcons.exe! Non usare strumenti Microsoft ufficiali! :-) – TarmoPikaro

0

Se si va alle impostazioni di progetto si vedrà un modo per impostare l'icona per l'applicazione.

enter image description here

Per aggiungere ulteriori icone ...

    Pulsante
  • destro del mouse sul progetto in Esplora soluzioni e scegliere Nuovo elemento e quindi risorse file
  • doppio clic sul file di risorse in solution explorer e pick Aggiungi risorsa -> Nuova icona
+0

lo so. l'ho già fatto se lo compilo, l'exe ha l'icona selezionata. ma come aggiungere altre icone? – 0xDEADBEEF

+0

@ 0xDEADBEEF si prega di vedere la mia modifica –

+2

non funziona (aggiunto Resource1.resx, caricato il file ico e clean + build solution). hm, ho dimenticato di menzionare (esplicitamente) che il mio programma è un problema WPF/.NET4 – 0xDEADBEEF

8

Ho appena creato un semplice strumento per fare esattamente questo senza dover rovinare i file .res. È una piccola utility che puoi usare come parte dell'evento Post-Build e ti consente di aggiungere tutti i file di icone in una particolare cartella all'assembly.Se si assume che si dispone di una cartella di icone nella cartella di progetto principale è possibile aggiungere il seguente evento di post-generazione:

C:\path\to\InsertIcons.exe $(TargetPath) $(ProjectDir)icons 

Un ulteriore descrizione e un download può essere trovato alla http://einaregilsson.com/add-multiple-icons-to-a-dotnet-application/

+0

Ottimo strumento! Ha funzionato perfettamente per i nostri bisogni. Grazie! – CMerat

0

Sulla base delle risposte che Vedo - sembra piuttosto banale, ma sfortunatamente non è così semplice.

Partiamo dal file RC - si può rapidamente scrivere il file in questo modo: myown.rc:

1 ICON "..\\Folder1\\icon1.ico" 
2 ICON "..\\folder2\\icon2.ico" 
1 24 "myown.manifest" 

Ma la prossima domanda - dove trovare file manifesto di cui avete bisogno per la vostra applicazione.

E 'possibile estrarre file manifesto attualmente utilizzato, utilizzando la linea di comando come questo:

mt -inputresource:myOwnNetExe.exe;#1 -out:myown.manifest 

e quindi è possibile utilizzare che si manifestano con il vostro eseguibile .net.

Ma questo non è tutto. Dal progetto stesso non è possibile specificare il percorso relativo al proprio file .res, è possibile utilizzare solo il percorso assoluto. Salva .csproj e modificalo manualmente con il blocco note - per rendere il percorso relativo. Il progetto si compila bene dopo.

Ma in svn/git - probabilmente non inserirai il file .res - solo il codice sorgente. È necessario compilare .rc su .res.

Meglio farlo in fase di progetto/pre-costruzione.

Ma ovviamente non è possibile avviare rc.exe, poiché è un progetto C++ e abbiamo un progetto C# che non interessa i percorsi del progetto C++.

questo può essere walkarounded utilizzando fase di pre-compilazione in questo modo:

cd $(ProjectDir) 
call "%VS100COMNTOOLS%\vsvars32.bat" >nul 
rc /c 1252 /nologo myown.rc 

Dove è necessario modificare VS100COMNTOOLS con Visual Studio con il quale si sta compilando (sto usando Visual Studio 2010).

E questo non è ancora tutto. Se si desidera cambiare l'icona dell'applicazione sul fly - in fase di esecuzione - si potrebbe essere interessati a pezzo di codice presentato in questo modo:

[DllImport("shell32.dll")] 
public static extern IntPtr ExtractIcon(IntPtr hInst, string file, int nIconIndex); 

[DllImport("user32.dll", SetLastError = true)] 
static extern bool DestroyIcon(IntPtr hIcon); 

/// <summary> 
/// Sets icon from .exe or .dll into form object 
/// </summary> 
/// <param name="iIconIndex">Icon index to use.</param> 
/// <param name="form">Form to assign to given icon</param> 
/// <returns>true if ok, false if failed.</returns> 
bool SetIcon(object form, int iIconIndex, String dllOrExe = null) 
{ 
    if(dllOrExe == null) 
     dllOrExe = System.Reflection.Assembly.GetExecutingAssembly().Location; 

    IntPtr hIcon = ExtractIcon(IntPtr.Zero, dllOrExe, iIconIndex); 

    if(hIcon == IntPtr.Zero) 
     return false; 

    Icon icon = (Icon) Icon.FromHandle(hIcon).Clone(); 
    DestroyIcon(hIcon); 

    form.GetType().GetProperty("Icon").SetValue(form, icon); 
    return true; 
} 

Dove in form_load è possibile inserire chiamata in questo modo:

SetIcon(this, N); 

Dove N = 0 per la prima icona, N = 1 - per la seconda e così via.

18.5.2016 Aggiornamento Il mio approccio funziona bene, tuttavia, dopo le proprietà del file di assieme, le informazioni sulla versione scompaiono. È possibile ripristinarlo utilizzando il tipico file C++ .rc, ma sfortunatamente per me non è in grado di suddividere gli attributi di assemblaggio in qualche modo: il task manager visualizzerà il tuo exe come "Applicazione". Ho provato a raccogliere un po 'più a fondo se è possibile in qualche modo alterare il titolo manifest/applicazione - ma senza alcun risultato. Dopo di che ho finito per utilizzare la soluzione InsertIcons.exe proposta qui pure.

Quindi, se non sei interessato alle informazioni sulla versione del file, puoi utilizzare la mia soluzione, se hai bisogno della versione del file e il task manager dovrebbe mostrare correttamente l'applicazione - usa InsertIcons.exe. C# code snipet (SetIcon) qui funzionerà per te in qualsiasi soluzione.

0

Ho utilizzato con successo l'approccio InsertIcons fino a quando Symantec anti virus ha iniziato a segnalare il mio exe come sospetto. La mia ipotesi è che a Symantec non piacesse il cambiamento di firma che deriva dall'avere a che fare con l'exe come una fase di post-produzione.

Alla fine sono andato con una libreria di classi .NET dll separato compilato utilizzando il seguente codice nel file csproj:

<PropertyGroup> 
    <Win32Resource>icons.res</Win32Resource> 
</PropertyGroup> 

non è necessario avere C++ costruire strumenti installati, ma si ha bisogno compilatore di risorse come descritto nella risposta accettata sopra.

Il mio file icons.rc si presenta così:

1 ICON "IconA.ico" 
2 ICON "IconB.ico" 
3 ICON "IconC.ico" 

E il comando pre-build è:

"C:\Program Files (x86)\Windows Kits\8.1\bin\x86\rc.exe" $(ProjectDir)icons.rc