2012-01-18 27 views
16

es posible establecer el icono de la aplicación en las propiedades del proyecto. Si haces esto, el exe tendrá este icono en lugar del predeterminado. Este icono es un win32-recursos y también se puede acceder de esta manera:Agregar varios iconos (Win32-Resource) a .NET-Application

change icon

quiero tener iconos especiales para los tipos de archivos que son utilizados por mi programa. para asociar un tipo de archivo-icono puedo especificarlo en el registro ("MyProg.exe, 1" en la clave "DefaultIcon").

así cómo AÑADIR MÁS iconos al conjunto que puedo usarlo para la asociación de tipo de archivo?

muchas gracias

ps: es un WPF Application (.NET 4.0)

Respuesta

15

Windows no sabe nada acerca de los recursos administrados, necesita agregar recursos no administrados a su ejecutable. En la captura de pantalla de parapura, debe seleccionar el botón de opción . Esto requiere un archivo .res, un archivo binario que se crea ejecutando la herramienta SDK rc.exe de Windows en un archivo .rc. El archivo .rc es un simple archivo de texto que contiene instrucciones de recursos, de forma similar a esta:

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

Asegúrese de guardar este archivo en la carpeta de proyecto sin codificación UTF-8, el Bloc de notas es lo mejor. Cree el archivo de la aplicación requerida. Manifiesto con Project + Add New Item, Application Manifest File. Agregue este archivo .rc a su proyecto con Project + Add Existing Item. Haga doble clic y verifique que pueda ver los iconos y el manifiesto. Haga clic con el botón derecho en el nodo superior, Agregar recurso y haga clic en Versión + Nuevo. Editar la información de la versión, ten en cuenta que coincidirá ya automáticamente los atributos en AssemblyInfo.cs

Puede compilar el archivo .rc en un archivo .res con el Visual Studio de comando:

rc /r something.rc 

Qué produce el archivo .res que puede usar en la pestaña de propiedades del proyecto. Hacer esto es un evento previo a la construcción es aconsejable pero un poco difícil de hacer bien. La cantidad de formas en que puede salir mal son numerosas, buena suerte.

+0

resuelto. pero he usado [ResEdit] (http://www.resedit.net/) para crear el archivo rc/res. funciona perfectamente – 0xDEADBEEF

+0

O simplemente implemente una DLL nativa que contenga dichos recursos con la aplicación, para que no tenga que ejecutar herramientas personalizadas o perder información de versiones. –

+0

Este método pierde información de la versión del archivo y, si la restaura de nuevo (por ejemplo, con el archivo .rc de estilo de versión de C++), seguirá teniendo problemas con el administrador de tareas/título de la aplicación incorrecto. (Vea mi propia solución y actualícela al final). ¡Entonces use InsertIcons.exe! ¡No use las herramientas oficiales de Microsoft! :-) – TarmoPikaro

0

Si vas a la configuración del proyecto, verá una forma de establecer el icono de la aplicación.

enter image description here

Para añadir iconos adicionales ...

    botón derecho del ratón sobre
  • proyecto en el Explorador de soluciones y recoger nuevo elemento y luego presentar Recursos
  • doble clic en el archivo de recursos en el explorador de soluciones y seleccione Agregar recurso -> Nuevo icono
+0

sé. Ya hice esto. si compilo esto, el exe tiene el ícono seleccionado. pero, ¿cómo agregar algunos iconos más? – 0xDEADBEEF

+0

@ 0xDEADBEEF, vea mi edición –

+2

no funciona (se agregó Resource1.resx, cargó el ico-file y clean + build solution). hm, olvidé mencionar (explícitamente) que mi programa es un problema de WPF/.NET4-Application – 0xDEADBEEF

8

Acabo de crear una herramienta simple para hacer exactamente esto sin tener que meterme con los archivos .res. Es una pequeña utilidad que puede usar como parte de su evento Post-Build y le permite agregar todos los archivos de iconos en una carpeta particular a su ensamblaje.Si asumimos que usted tiene una carpeta de iconos en su carpeta de proyecto principal puede agregar el siguiente evento posterior a la generación:

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

Una descripción más detallada y una descarga se puede encontrar en http://einaregilsson.com/add-multiple-icons-to-a-dotnet-application/

+0

¡Gran herramienta! Funcionó perfectamente para nuestras necesidades. ¡Gracias! – CMerat

0

Sobre la base de las respuestas, que Ya veo, parece ser bastante trivial, pero desafortunadamente no es tan simple.

Vamos a empezar desde el archivo .rc - se puede escribir rápidamente archivos de esta manera: myown.rc:

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

Pero la próxima pregunta - dónde obtener el archivo de manifiesto que se necesita para su aplicación.

Es posible extraer el archivo de manifiesto utilizado actualmente, el uso de línea de comandos de la siguiente manera:

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

Y entonces usted puede utilizar que se manifiestan con su ejecutable .NET.

Pero esto no es todo. Desde el proyecto en sí no puede especificar la ruta relativa a su archivo .res, solo puede usar la ruta absoluta. Guarde .csproj y edítelo manualmente con el bloc de notas, para hacer que la ruta sea relativa. El proyecto compila bien después de eso.

Pero en svn/git - probablemente no ponga el archivo .res - solo el código fuente. Necesitas compilar .rc a .res.

Lo mejor es hacerlo en el paso de proyecto/preconstrucción.

Pero, por supuesto, no se puede iniciar rc.exe, ya que es un proyecto de C++, y tenemos un proyecto de C# que no se preocupa por los patrones de proyecto de C++.

Esto se puede usar walkarounded etapa de pre-construcción como esta:

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

Cuando es necesario cambiar VS100COMNTOOLS con Visual Studio con la que se está compilando (estoy usando Visual Studio 2010).

Y esto todavía no es todo. Si desea cambiar el icono de la aplicación en marcha - en tiempo de ejecución - que podría estar interesado en código snipet así:

[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; 
} 

Donde en Form_Load puede colocar llamada como ésta:

SetIcon(this, N); 

Donde N = 0 para el primer icono, N = 1 - para el segundo y así sucesivamente.

18.5.2016 Actualización Mi enfoque funciona bien, sin embargo, después de estas propiedades del archivo de ensamblaje, la información de la versión desaparece. Es posible restablecerlo utilizando el típico archivo .rc de C++, pero desafortunadamente para mí rompe los atributos de ensamblaje de alguna manera, el administrador de tareas mostrará su ejecutable como "Aplicación". He intentado cosechar más profundo si es posible alterar de algún modo el título del manifiesto/aplicación, pero sin ningún resultado. Después de eso, terminé usando la solución InsertIcons.exe aquí propuesta.

Así que si no está interesado en la información sobre la versión del archivo (puede usar mi solución, si necesita una versión de archivo y el administrador de tareas debe mostrarla correctamente), utilice InsertIcons.exe. C# code snipet (SetIcon) aquí funcionará para usted en cualquier solución que sea.

0

Utilicé el enfoque de InsertIcons con éxito hasta que el antivirus de Symantec comenzó a marcar mi exe como sospechoso. Supongo que a Symantec no le gustó el cambio en la firma que implica meterse con el exe como un paso posterior a la compilación.

Al final me fui con una biblioteca de clases .NET DLL compilado por separado usando el siguiente código en el archivo csproj:

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

que no es necesario tener instalados C++ construir herramientas, pero sí es necesario compilador de recursos como se describe en la respuesta aceptada anteriormente.

Mi archivo icons.rc se ve así:

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

Y el comando pre-construcción es:

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