Error al implementar la aplicación ClickOnce: la referencia en el manifiesto no coincide con la identidad del ensamblado descargado

105

Estoy intentando implementar una aplicación ClickOnce, pero la instalación falla en el cliente. Aquí está el registro de errores:

PLATFORM VERSION INFO
Windows             : 6.1.7601.65536 (Win32NT)
Common Language Runtime     : 4.0.30319.1
System.Deployment.dll       : 4.0.30319.1 (RTMRel.030319-0100)
clr.dll             : 4.0.30319.1 (RTMRel.030319-0100)
dfdll.dll           : 4.0.30319.1 (RTMRel.030319-0100)
dfshim.dll          : 4.0.31106.0 (Main.031106-0000)

SOURCES
Deployment url          : http://MyProduct.com/download/workstation/MyProduct%20Front%20Desk.application
                    Server      : Microsoft-IIS/7.5
                    X-Powered-By    : ASP.NET
Deployment Provider url     : http://MyProduct.com/Download/Workstation/MyProduct%20Front%20Desk.application
                    Server      : Microsoft-IIS/7.5
                    X-Powered-By    : ASP.NET
Application url         : http://MyProduct.com/Download/Workstation/Application%20Files/MyProduct%20Front%20Desk_1_0_0_7/MyProduct%20Front%20Desk.exe.manifest
                    Server      : Microsoft-IIS/7.5
                    X-Powered-By    : ASP.NET

IDENTITIES
Deployment Identity     : MyProduct Front Desk.application, Version=1.0.0.7, Culture=neutral, PublicKeyToken=df343a0868ab2d74, processorArchitecture=msil
Application Identity        : MyProduct Front Desk.exe, Version=1.0.0.7, Culture=neutral, PublicKeyToken=df343a0868ab2d74, processorArchitecture=msil, type=win32

APPLICATION SUMMARY
* Installable application.

ERROR SUMMARY
Below is a summary of the errors, details of these errors are listed later in the log.
* Activation of http://MyProduct.com/download/workstation/MyProduct%20Front%20Desk.application resulted in exception. Following failure messages were detected:
    + Reference in the manifest does not match the identity of the downloaded assembly MyProductSiteServer.exe.

COMPONENT STORE TRANSACTION FAILURE SUMMARY
No transaction error was detected.

WARNINGS
There were no warnings during this operation.

OPERATION PROGRESS STATUS
* [03/17/11 11:51:04] : Activation of http://MyProduct.com/download/workstation/MyProduct%20Front%20Desk.application has started.
* [03/17/11 11:51:04] : Processing of deployment manifest has successfully completed.
* [03/17/11 11:51:04] : Installation of the application has started.
* [03/17/11 11:51:05] : Processing of application manifest has successfully completed.
* [03/17/11 11:51:06] : Found compatible runtime version 4.0.30319.
* [03/17/11 11:51:06] : Request of trust and detection of platform is complete.

ERROR DETAILS
Following errors were detected during this operation.
* [03/17/11 11:51:30] System.Deployment.Application.InvalidDeploymentException (RefDefValidation)
    - Reference in the manifest does not match the identity of the downloaded assembly MyProductSiteServer.exe.
    - Source: System.Deployment
    - Stack trace:
        at System.Deployment.Application.DownloadManager.ProcessDownloadedFile(Object sender, DownloadEventArgs e)
        at System.Deployment.Application.FileDownloader.DownloadModifiedEventHandler.Invoke(Object sender, DownloadEventArgs e)
        at System.Deployment.Application.SystemNetDownloader.DownloadSingleFile(DownloadQueueItem next)
        at System.Deployment.Application.SystemNetDownloader.DownloadAllFiles()
        at System.Deployment.Application.FileDownloader.Download(SubscriptionState subState)
        at System.Deployment.Application.DownloadManager.DownloadDependencies(SubscriptionState subState, AssemblyManifest deployManifest, AssemblyManifest appManifest, Uri sourceUriBase, String targetDirectory, String group, IDownloadNotification notification, DownloadOptions options)
        at System.Deployment.Application.ApplicationActivator.DownloadApplication(SubscriptionState subState, ActivationDescription actDesc, Int64 transactionId, TempDirectory& downloadTemp)
        at System.Deployment.Application.ApplicationActivator.InstallApplication(SubscriptionState& subState, ActivationDescription actDesc)
        at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
        at System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)

COMPONENT STORE TRANSACTION DETAILS
No transaction information is available.

El ejecutable principal que necesito implementar es MyProductFrontDesk.exe, que depende deMyProductSiteServer.exe archivo ejecutable - y parece ser donde se produce el error: "La referencia en el manifiesto no coincide con la identidad del ensamblado descargado MyProductSiteServer.exe".

¿Qué manifiesto debe corregirse? ¿Y cómo?

Shaul Behr
fuente
¿El proyecto MySiteServer.exe está en la misma solución de Visual Studio que MyProductFrontDesk.exe? Si es así, ¿su configuración de compilación tiene ambos ensamblados seleccionados para compilar?
Jay
@Jay: sí, en la misma solución, ambos seleccionados para construir.
Shaul Behr

Respuestas:

111

Hubo un problema con Visual Studio 2008 que se resuelve al no incrustar el manifiesto predeterminado ; uno de los comentarios sobre ese artículo sugiere que el problema aún existe en Visual Studio 2010.

En las propiedades del proyecto -> pestaña Aplicación -> Recursos -> Icono de casilla de verificación y manifiesto , la configuración "Incrustar manifiesto con la configuración predeterminada" causó el problema. Establecerlo en "Crear aplicación sin un manifiesto" soluciona el problema.

stuartd
fuente
Encontré el comentario 488301 particularmente útil: el <assemblyIdentity/>elemento en el manifiesto personalizado se puede ajustar (u omitir para permitir que el compilador emita la identidad de ensamblaje correcta) en su .manifestarchivo personalizado , lo que permite especificar cosas como <requestedExecutionLevel/>sin romper ClickOnce.
binki
4
Mi escenario fue una aplicación GUI que necesita una segunda aplicación que es una aplicación de consola. Si, como yo, prefiere no cambiar la configuración predeterminada, la publicación manual de esa segunda aplicación creó un manifiesto de aplicación que apareció en la carpeta Propiedades, y luego la publicación de la primera aplicación funcionó sin tener que cambiar la configuración predeterminada de incrustar un manifiesto.
aybe
7
Tuve el mismo problema con VS 2013. Esta solución funcionó.
EagleBeak
2
@EagleBeak ¿dónde está este menú en VS2013? No veo nada sobre "crear una aplicación sin manifiesto"
Nefariis
3
A partir de junio de 2016, la respuesta correcta es configurar la configuración de seguridad de ClickOnce (ver la respuesta publicada por Mauro).
Pierre Arnaud
57

Tuve el mismo problema cuando agregué una referencia a otro proyecto.

La forma de resolver esto fue habilitar la configuración de seguridad de ClickOnce en todos los proyectos referenciados como Ian explicó aquí (el énfasis es mío):

Para mí, la forma en que esto se resolvió fue para asegurar que todos los proyectos de la Solución que exponían la " Ficha de seguridad " en sus " Propiedades del proyecto " tuvieran la opción " Habilitar la configuración de seguridad de ClickOnce " marcada con la opción " Esta es una confianza total aplicación "Seleccionado. Esto tiene que ver con crear el Manifiesto correctamente y la aplicación no se instalará si estas opciones no están configuradas en todos los Proyectos dentro de la Solución que lo requieran.

Creo que esta es la forma correcta de solucionarlo al hacer una referencia a otro proyecto con la misma solución.

La publicación del foro vinculada ya ha expirado, pero está disponible en el archivo aquí .

Mauro
fuente
1
Después de probar tantas soluciones, solo esta solución funciona para mí. Así que también creo que esta debería ser la respuesta aceptada ...
Tareq
Puede hacer lo mismo modificando el .cprojarchivo con<PropertyGroup><TargetZone>LocalIntranet</TargetZone></PropertyGroup>
VMAtm
Había desactivado esas dos configuraciones mientras estaba jugando https://github.com/Squirrel. Cuando mis implementaciones de ClickOnce (que no son de producción) dejaron de funcionar, me había olvidado por completo de esto.
Walter Stabosz
35

Me estaba encontrando con el mismo problema, pero mi solución era muy diferente.

Mi aplicación ClickOnce hacía referencia a otro proyecto de archivo EXE en mi solución, por lo que cuando el cliente lo descargó y había otro archivo EXE, ese no tenía un manifiesto.

Eliminar la dependencia de otro ejecutable resolvió mi problema.

skimania
fuente
2
También tengo dos EXE. Al eliminar la dependencia, se excluye el EXE referenciado de la compilación. ¿Hay alguna forma de incluirlo?
Uri Abramson
10
Esta fue la solución para mí. Uno de los proyectos a los que hacía referencia mi EXE principal era en sí mismo una 'Aplicación de Windows'. Cuando cambié ese proyecto a 'Biblioteca de clases' y lo volví a publicar, todo funcionó.
Chris Ray
Usé la sugerencia de @ChrisRay en VS2012 y el programa se instaló sin ninguna dificultad. ¡Gracias!
Rolan
1
como el usuario @Aybe menciona en los comentarios de otra respuesta, si publica la segunda aplicación de forma ficticia, obtendrá su propio manifiesto y luego podrá publicar la primera aplicación y ambos programas funcionarán juntos. (En mi caso tengo dos programas, uno que llama al otro.)
Dave Cousineau
La solución para mí fue realmente ambas (esto y @stuartd): tengo un EXE como ensamblado de referencia, que no tiene un manifiesto. Pero no puedo "eliminar" esta referencia porque necesito usarla. Entonces tuve que ir al proyecto de esta dependencia EXE, aplicar la sugerencia de stuartd. Entonces todo funciona muy bien.
KFL
11

Confirmé que el problema también existe en Visual Studio 2010. Al seleccionar "Crear aplicación sin un manifiesto" en Propiedades del proyecto - Aplicación - Recursos se resolvió el problema.

Eduardo
fuente
8
Solo una nota de que tuve que cambiar esta propiedad en el proyecto del que se quejaba el mensaje de error, que para mí era un proyecto al que hacía referencia el proyecto que en realidad estaba tratando de publicar, no el proyecto que en realidad estaba tratando de publicar. .
deadlydog
6

Esto también puede suceder si tiene dos versiones diferentes de un paquete NuGet referenciado en diferentes archivos DLL en su proyecto. En mi caso, estaba usando un marco llamado Catel, y tenía una versión más nueva referenciada en un archivo DLL que en otro (supervisión), pero esto hizo que ClickOnce escupiera este error. Hacer referencia a la misma versión resolvió el problema.

Bitfiddler
fuente
4

Tuve el mismo problema, pero mi solución fue cambiar el 'Objetivo de la plataforma' a 'x86' (Propiedades del proyecto -> Ficha de compilación). Se configuró en Cualquier CPU. Tan pronto como cambié la configuración y volví a publicar, el instalador de ClickOnce pudo completarse.

Paul Whygle
fuente
1
Problema muy similar: tenía habilitado "Preferir 32 bits"; apagarlo solucionó el problema.
Roman Starkov
4

Experimenté el mismo error al implementar con el proyecto configurado en Debug. Cuando se cambió de nuevo a Release, no hubo ningún error.

Dave
fuente
4

Tuve exactamente el mismo problema. No pude eliminar la dependencia ya que la necesitaba el proyecto principal. El segundo proyecto fue un proyecto de consola.

Cambié a la Biblioteca de clases y luego todo funcionó.

usuario2971656
fuente
Este comentario solucionó mi problema. ¡Gracias!
casaout
2

Otra solución alternativa, en caso de que el archivo ejecutable de dependencia con el manifiesto de la aplicación incorrecta no se pueda cambiar (digamos que proviene de un paquete NuGet). El binario se puede incluir como contenido con una extensión ficticia para que ClickOnce no intente validar el manifiesto y luego se le cambie el nombre durante el inicio de la aplicación.

csproj:

  <Content Include="..\packages\<package>\lib\<app>.exe">
    <Link><app>.exe.bin</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
  <ItemGroup>
    <PublishFile Include="<app>">
      <Visible>False</Visible>
      <Group>
      </Group>
      <TargetPath>
      </TargetPath>
      <PublishState>Exclude</PublishState>
      <IncludeHash>True</IncludeHash>
      <FileType>Assembly</FileType>
    </PublishFile>
  </ItemGroup>

App.xaml.cs:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        var appDir = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
        if (!File.Exists($"{appDir}\\<app>.exe"))
        {
            File.Copy($"{appDir}\\<app>.exe.bin", $"{appDir}\\<app>.exe");
        }
    }
}
Matthieu Maitre
fuente
1

Tuve el mismo problema y probé todas las soluciones sugeridas anteriormente aquí, y todas no funcionaron.

Lo arreglé cambiando la ubicación de actualización. Desde las propiedades del proyecto -> Publicar -> Actualizaciones . Cambie la ubicación de la actualización a su carpeta publicada.

Majid Alshezawi
fuente
1

TAMBIÉN RESUELTO PARA ClickOnce .exe llamando a .exe llamando a .exe.

También tuve este problema al usar VB.NET en Visual Studio 2010.

Tengo una aplicación ClickOnce Windows Forms que hace referencia a una segunda aplicación Windows Forms que a su vez hace referencia a una tercera aplicación Windows Forms. (Estas segundas y terceras aplicaciones son EXE archivos lugar de archivos DLL para simplificar, ya que es igualmente probable que se ejecuten de forma independiente o se llamen con las propiedades que se les pasan).

Tuve que comentar AMBOS contenidos del manifiesto de la segunda y tercera aplicaciones por:

Tutorial: Implementación manual de una aplicación ClickOnce

Funciona perfectamente.

peter williamson
fuente
1

Si tiene un programa principal que hace referencia a otro, entonces debe hacer el truco "Crear aplicación sin un manifiesto" en el Programa del programa principal:

Proyecto -> Propiedades -> Pestaña Aplicación -> Recursos -> Manifiesto -> menú desplegable "Crear aplicación sin manifiesto"

y luego cambie a las Propiedades del proyecto del programa al que se hace referencia y repita el proceso.

RoySeberg
fuente
0

Estoy usando Visual Studio 2012 en Windows 7 y necesito publicar una solución que consta de dos proyectos.

Como señaló Eduardo, marcar ambos proyectos como ClickOnce y habilitar Full Trust Application resuelve el problema.

user819490
fuente
0

Tenía un problema un poco diferente que pude resolver y por eso quería publicar. Mi problema era que estaba ejecutando 3 ramas de TFS. Había actualizado los controles de Telerik en una de mis sucursales, pero no en las demás. Una vez que actualicé los controles de Telerik en las 3 ramas y los volví a publicar, funcionó y este error desapareció.

Estaba ejecutando VS2015 en ese momento.

jaredbaszler
fuente
0

Es interesante. Acabo de volver a implementar la aplicación y el problema se resolvió. Tal vez un archivo dañado debido a la red.

huseyindotpw
fuente
0

Utilizo mage.exepara generar mi manifiesto. Agregar esto a mi .csprojsolucionó el problema. También puede probar la -nowin32manifest bandera del compilador ; No lo he probado. No veo "Crear aplicación sin un manifiesto" de stuartd en Visual Studio 2017; Creo que esto es lo que hace.

<PropertyGroup>
  <NoWin32Manifest>true</NoWin32Manifest>
</PropertyGroup>

También tengo esto en mi .csproj:

<GenerateManifests>false</GenerateManifests>
DharmaTurtle
fuente
0

En mi versión de Visual Studio 2017, versión 15.6.6 (pero puede haber estado allí antes), encontré que los archivos de la aplicación no estaban en el proyecto Exe Click derecho y publicar, sino en la pestaña Publicar de propiedades del proyecto, donde puede establecer qué de los archivos de la aplicación que desea colocar en la instalación.

Así que elimine los que son un problema. Si ya hay algo instalado en una computadora donde se instalará esta aplicación, no hay razón para intentar reinstalarla de todos modos, excepto si necesita la referencia para que se ejecute. Si fuera a instalar lo que ya estaba en la PC, pero en una carpeta diferente, podría no funcionar. Es mejor utilizar las otras aplicaciones o ensamblajes dll en la misma ubicación en la que se instalaron anteriormente.

John Foll
fuente
0

Tuve el mismo problema hace un par de minutos, y a continuación se muestran los pasos que utilicé para resolverlo.

Llave

  • a = Proyecto principal (el proyecto que desea publicar, por ejemplo, myProduct)
  • b = Proyecto de referencia (por ejemplo, MyProductSiteServer)

Lista de Verificación

  1. Navegue a propiedades -> Aplicación -> Recursos -> verifique los íconos y el manifiesto (para ayb)

  2. Navegue a propiedades -> Construir: asegúrese de que ayb estén en la misma plataforma de destino

  3. Vaya a propiedades -> Seguridad y asegúrese de que ayb tengan marcada esta configuración: "Habilitar la configuración de seguridad de ClickOnce" y "Esta es una aplicación de plena confianza".

  4. Navegue a propiedades -> Publicar: le recomiendo que cambie la ruta de la carpeta de publicación

Kingsley Akpan
fuente
0

Tuve exactamente el mismo problema con mi aplicación VS 2019.

Intenté crear la aplicación sin un manifiesto, sin embargo, no funcionó.

Sin embargo, lo que funcionó fue lo siguiente:

  1. Vaya a Construir -> Publicar -> Aplicación
  2. Haga clic en el botón "Información de montaje"
  3. Marque la opción "Hacer visible COM de ensamblaje"

¡Con suerte, esto ayuda!

LaurentiuMa
fuente