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.
risolto. ma ho usato [ResEdit] (http://www.resedit.net/) per creare il file rc/res. funziona perfettamente – 0xDEADBEEF
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. –
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