c# - restaurar - ¿Cómo registrar manualmente las asociaciones de archivos ClickOnce después de la instalación?
restaurar asociaciones de archivos windows 10 (5)
El sistema de implementación ClickOnce de Microsoft ofrece un administrador de asociación de archivos fácil de usar que está integrado en el proceso de implementación de Visual Studio . Los desarrolladores pueden agregar hasta 8 asociaciones de archivos que se asociarán automáticamente con su aplicación cuando el usuario ejecute el instalador ClickOnce.
Sin embargo, me gustaría ir un paso más allá: quiero permitir que los usuarios agreguen o eliminen manualmente asociaciones de archivos adicionales después de la instalación desde mi aplicación.
Tengo dos motivaciones para lograr esto:
- No "forzaré" asociaciones de archivos adicionales en el usuario, que es cómo se manejan las asociaciones de archivos a través de las implementaciones de ClickOnce.
- Los usuarios pueden agregar o eliminar sus propias asociaciones de archivos únicos en su tiempo libre.
La parte difícil: asociar directamente un tipo de archivo con un ejecutable no es compatible con las implementaciones de ClickOnce
A diferencia de las aplicaciones tradicionales de Windows, las aplicaciones ClickOnce no se inician directamente a través de su ejecutable. En su lugar, se lanzan a través de un acceso directo especial .appref-ms
que maneja la magia ClickOnce detrás de escena (actualizaciones automáticas, ubicación de los archivos ejecutables en un directorio %LOCALAPPDATA%
en %LOCALAPPDATA%
, etc.).
Si una aplicación implementada por ClickOnce se abre directamente a través de su ejecutable, las actualizaciones automáticas se desactivan y los métodos específicos de ClickOnce ya no funcionarán. Debido a esto, las asociaciones de archivos de registro tradicionales no son posibles para mi caso de uso.
Cómo Visual Studio maneja las asociaciones de archivos ClickOnce
La siguiente imagen muestra el administrador de asociación de archivos ClickOnce integrado en Visual Studio 2010. Esta información se almacena en el archivo .manifest de la aplicación y se agrega al registro de Windows después de la instalación.
He investigado un poco en mi registro y he identificado varias entradas realizadas por el instalador de ClickOnce para asociar los tipos de archivo con la aplicación implementada de ClickOnce.
Un ejemplo de clave de registro para una asociación de tipo de archivo ClickOnce que encontré en mi registro:
rundll32.exe dfshim.dll, ShOpenVerbExtension {ae74407a-1faa-4fda-9056-b178562cf98f} %1
Donde {ae74407a-1faa-4fda-9056-b178562cf98f}
es un GUID utilizado en varias otras ubicaciones en el registro para la aplicación asociada.
Mi objetivo es saber qué información se debe agregar al registro (programáticamente) para asociar manualmente los archivos con una aplicación implementada ClickOnce.
Cualquier ayuda es apreciada!
¿Qué pasa con el comando Assoc?
http://support.microsoft.com/kb/184082
assoc /?Muestra o modifica las asociaciones de extensión de archivo.
ASSOC [.ext [= [fileType]]]
.ext Especifica la extensión de archivo para asociar el tipo de archivo con fileType Especifica el tipo de archivo para asociar con la extensión de archivo
Escriba ASSOC sin parámetros para mostrar las asociaciones de archivos actuales. Si se invoca ASSOC con solo una extensión de archivo, muestra la asociación de archivo actual para esa extensión de archivo. No especifique nada para el tipo de archivo y el comando eliminará la asociación para la extensión del archivo.
Las asociaciones de archivos pueden ser de nivel de máquina o de usuario. Generalmente, las cosas en el área de HKCR son para asociaciones de archivo de nivel de máquina. Las cosas en el área HKCU / Software / Classes son cosas por usuario que el usuario ha personalizado (o que ha personalizado para ellos). Algo como "assoc" funcionará en XP, 7 y probablemente en Windows 8 (aunque aún no he usado este cmd en Windows 8).
Ok, después de experimentar el mismo problema y hacer algunas excavaciones serias, creo que tengo una solución. Evan Wondrasek estaba en el camino correcto con el comando rundll, y pude hacer que lo siguiente funcionara en un entorno de prueba.
Esencialmente, Uri Abramson tenía razón en que el Guid en el comando rundll.exe es una referencia a la aplicación Clickonce, pero no aparece en ninguna otra parte del registro. Lo que hace referencia es en realidad las otras claves en HKCU/Software/Classes
.
Para que el archivo de referencia funcione, primero necesita un ProgID
para su aplicación. A mi entender, esto puede ser lo que desee, o lo que normalmente configuraría en el menú de publicación ClickOnce en Visual Studio.
También deberá crear un nuevo Guid y conocer el contenido de su archivo de referencia de aplicación (.appref-ms).
Para mi ejemplo usaré lo siguiente:
ProgId: FASERVER.TestApp
Guid: ce6b2c69-ec54-4182-a87f-74c5dfe1a03e
AppRefFileContents: http://SomeAddress.SomeDomain/TestApp/TestApp.application#TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86
Por favor, use su equivalente de los valores anteriores en el siguiente código.
Para comenzar, FASERVER.TestApp
una nueva clave de registro en HKCU/Software/Classes
llamada FASERVER.TestApp
con las siguientes cadenas:
(Default) = SomeFileType
AppId = TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86
DeploymentProviderUrl = http://SomeAddress.SomeDomain/TestApp/TestApp.application
Guid = {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}
Una vez que haya establecido estos valores, cree dos nuevas subclaves shell
y shellex
.
Establezca el valor (Default)
del shell
para open
. A continuación, cree una subclave de shell
llamada open
y una subclave de command
llamada open
. Establezca el valor (Default)
del command
en lo siguiente:
rundll32.exe dfshim.dll, ShOpenVerbExtension {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e} %1
Cree una subclave de shellex
llamada IconHandler
y establezca su valor (Default)
en {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}
Navegue hasta HKCU/Software/Classes/CLSID
y cree una nueva clave {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}
con las siguientes cadenas:
(Default) = Shell Icon Handler For Tif File
AppId = TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86
DeploymentProviderUrl = http://SomeAddress.SomeDomain/TestApp/TestApp.application
IconFile = YourIconFile.ico
Nota: Su icono debe estar en su proyecto ClickOnce.
Ahora cree una subclave bajo {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}
llamada InProcServer32
con los siguientes valores:
(Default) = dfshim.dll
ThreadingModel = Apartment
Por último, debemos vincular las claves anteriores con las asociaciones de archivos que deseamos. Para hacer esto, navegue a HKCU/Software/Classes
y haga lo siguiente para cada extensión de archivo deseada.
Establecer las cadenas de FileExt de la siguiente manera:
(Default) = FASERVER.TestApp
AppId = TestApp.application, Culture=neutral, PublicKeyToken=df31b9b884b9be10, processorArchitecture=x86
DeploymentProviderUrl = http://SomeAddress.SomeDomain/TestApp/TestApp.application
Guid = {ce6b2c69-ec54-4182-a87f-74c5dfe1a03e}
¡Eso es! Usted debe estar hecho.
Tenga en cuenta que esto no configurará su aplicación como el programa predeterminado para ese tipo de archivo, sino que simplemente agregará una entrada de "Biblioteca de soporte de aplicaciones ClickOnce" al menú "Abrir con".
Espero que esto funcione para alguien que no sea yo y perdón por el ejemplo tan largo.
Puede averiguar las claves de registro que se agregarán, usando el Monitor de proceso de Windows Sysinternals (conocido anteriormente como RegMon).
Capture eventos cuando instale su aplicación utilizando ClickOnce con asociaciones de archivos predeterminadas. Se registrará todas las operaciones de registro (muchos de ellos).
Necesitaría usar algunos filtros para identificar fácilmente las claves de registro.
Si desea registrar manualmente la asociación de archivos, no es asunto de ClickOnce. Puede agregar claves manualmente al registro para configurar la asociación de archivos. Y si desea eliminar la asociación establecida por cliconce, simplemente elimine la clave de registro.
private static void SetFileAssociation(string icon, string application, string openArg, string extension , string progId , string description )
{
Trace.WriteLine("-----Create File Association-----");
RegistryKey classesKey = Registry.CurrentUser.OpenSubKey(@"Software/Classes", true);
classesKey.CreateSubKey(extension).SetValue(string.Empty, progId);
RegistryKey progKey = classesKey.CreateSubKey(progId);
if (description != null)
{
progKey.SetValue(string.Empty, description);
}
if (icon != null)
{
progKey.CreateSubKey("DefaultIcon").SetValue(string.Empty, icon);
}
progKey.CreateSubKey(@"Shell/Open/Command").SetValue(string.Empty,
application + openArg);
Trace.WriteLine("-----Finish File Association-----");
}
Solución alternativa: puede asociarse con el acceso directo de la aplicación ClickOnce ubicada en:
C:/Users/[Your username]/AppData/Roaming/Microsoft/Windows/Start Menu/[Program folder]/[Shortcut name]