Erreur lors du déploiement de l'application ClickOnce - La référence dans le manifeste ne correspond pas à l'identité de l'assembly téléchargé

105

J'essaye de déployer une application ClickOnce, mais l'installation échoue sur le client. Voici le journal des erreurs:

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.

L'exe principal que je dois déployer est MyProductFrontDesk.exe, qui a une dépendance sur MyProductSiteServer.exe- et qui semble être là où l'erreur est levée: "La référence dans le manifeste ne correspond pas à l'identité de l'assembly téléchargé MyProductSiteServer.exe."

Quel manifeste doit être corrigé? Et comment?

Shaul Behr
la source
Le projet MySiteServer.exe est-il dans la même solution Visual Studio que MyProductFrontDesk.exe? Si tel est le cas, votre configuration de génération a-t-elle les deux assemblys sélectionnés pour générer?
Jay
@Jay - oui, dans la même solution, tous deux sélectionnés pour construire.
Shaul Behr

Réponses:

111

Il y avait un problème avec Visual Studio 2008 qui est résolu en n'incorporant pas le manifeste par défaut - l'un des commentaires sur cet article suggère que le problème existe toujours dans Visual Studio 2010.

Dans les propriétés du projet -> onglet Application -> Ressources -> case à cocher Icône et manifeste , le paramètre «Incorporer le manifeste avec les paramètres par défaut» a causé le problème. Le paramétrer sur "Créer une application sans manifeste" résout le problème.

stuartd
la source
J'ai trouvé le commentaire 488301 particulièrement utile: l' <assemblyIdentity/>élément du manifeste personnalisé peut être ajusté (ou omis pour permettre au compilateur d'émettre la bonne identité d'assemblage) dans votre .manifestfichier personnalisé , ce qui permet de spécifier des choses comme <requestedExecutionLevel/>sans casser ClickOnce.
binki
4
Mon scénario était une application GUI qui a besoin d'une deuxième application qui est une application console. Si, comme moi, vous préférez ne pas modifier les paramètres par défaut, la publication manuelle de cette deuxième application a créé un fichier app.manifest qui apparaît dans le dossier Propriétés, puis la publication à nouveau de la première application a fonctionné sans avoir à modifier les paramètres par défaut d'incorporation d'un manifeste.
aybe
7
Eu le même problème avec VS 2013. Cette solution a fonctionné.
EagleBeak
2
@EagleBeak où est ce menu dans VS2013? Je ne vois rien à propos de "créer une application sans manifeste"
Nefariis
3
Depuis juin 2016, la bonne réponse est de configurer les paramètres de sécurité ClickOnce (voir la réponse publiée par Mauro).
Pierre Arnaud le
57

J'ai eu le même problème lorsque j'ai ajouté une référence à un autre projet.

La façon de résoudre ce problème était d'activer les paramètres de sécurité ClickOnce dans tous les projets référencés, comme Ian l'a expliqué ici (c'est moi qui souligne):

Pour moi, la façon dont cela a été résolu était de s'assurer que tous les projets sous la solution qui exposaient l' onglet " Sécurité " dans leurs " Propriétés du projet " avaient l'option " Activer les paramètres de sécurité ClickOnce " cochée avec l'option " C'est une confiance totale application "Sélectionné. Cela a à voir avec la création correcte du manifeste et l'application ne s'installera pas si ces options ne sont pas définies sur tous les projets de la solution qui le nécessitent.

Je pense que c'est la bonne façon de résoudre ce problème lorsque vous faites référence à un autre projet sous la même solution.

Le message lié au forum a expiré maintenant, mais il est disponible dans les archives ici .

Mauro
la source
1
Après avoir essayé tant de solutions, seule cette solution fonctionne pour moi. Donc, je pense aussi que cela devrait être la réponse acceptée ...
Tareq
Vous pouvez faire de même en modifiant le .cprojfichier avec<PropertyGroup><TargetZone>LocalIntranet</TargetZone></PropertyGroup>
VMAtm
J'avais désactivé ces deux paramètres pendant que je m'amusais avec https://github.com/Squirrel. Lorsque mes déploiements ClickOnce (hors production) ont cessé de fonctionner, j'avais tout oublié.
Walter Stabosz
35

Je rencontrais le même problème, mais ma solution était très différente.

Mon application ClickOnce faisait référence à un autre projet de fichier EXE dans ma solution, donc lorsque le client l'a téléchargé et qu'il y avait un autre fichier EXE, celui-ci n'avait pas de manifeste.

La suppression de la dépendance à un autre exécutable a résolu mon problème.

skimania
la source
2
J'ai aussi deux EXE. La suppression de la dépendance exclut le fichier EXE référencé de la génération. Y a-t-il un moyen de l'inclure?
Uri Abramson
10
C'était la solution pour moi. L'un des projets auxquels mon EXE principal faisait référence était lui-même une «application Windows». Lorsque j'ai changé ce projet en «Bibliothèque de classes» et que j'ai republié, tout fonctionnait.
Chris Ray
J'ai utilisé la suggestion de @ChrisRay dans VS2012, et le programme s'est installé sans aucune difficulté. Merci!
Rolan le
1
comme le mentionne l'utilisateur @Aybe dans les commentaires d'une autre réponse, si vous publiez fictivement la deuxième application, elle obtiendra son propre manifeste et vous pourrez ensuite publier la première application et les deux programmes fonctionneront ensemble. (Dans mon cas, j'ai deux programmes, l'un qui appelle l'autre.)
Dave Cousineau
La solution pour moi était vraiment les deux (ceci et @stuartd) - j'ai un EXE comme assembly de référence, qui n'a pas de manifeste. Mais je ne peux pas "supprimer" cette référence car je dois l'utiliser. J'ai donc dû aller au projet de cette dépendance EXE, appliquer la suggestion de stuartd. Ensuite, tout fonctionne très bien.
KFL
11

J'ai confirmé que le problème existe également dans Visual Studio 2010. La sélection de «Créer une application sans manifeste» dans Propriétés du projet - Application - Ressources a résolu le problème.

Eduardo
la source
8
Juste une note que j'ai dû changer cette propriété sur le projet dont le message d'erreur se plaignait, qui pour moi était un projet référencé par le projet que j'essayais réellement de publier, pas le projet que j'essayais réellement de publier .
deadlydog
6

Cela peut également se produire si vous avez deux versions différentes d'un package NuGet référencées dans différents fichiers DLL de votre projet. Dans mon cas, j'utilisais un framework appelé Catel, et j'avais une version plus récente référencée dans un fichier DLL qu'un autre (oubli), mais cela a provoqué ClickOnce à cracher cette erreur. Le référencement de la même version a résolu le problème.

Bitfiddler
la source
4

J'ai eu le même problème, mais ma solution était de changer la «cible de la plate-forme» en «x86» (Propriétés du projet -> onglet Construire). Il a été défini sur N'importe quel processeur. Dès que j'ai changé le paramètre et republié, le programme d'installation de ClickOnce a pu se terminer.

Paul Whygle
la source
1
Problème très similaire: j'avais "Préférer 32 bits" activé; l'éteindre a résolu le problème.
Roman Starkov
4

J'ai rencontré la même erreur lors du déploiement avec le projet défini sur Debug. Lorsqu'il a été rétabli en Release, il n'y avait aucune erreur.

Dave
la source
4

J'ai eu exactement le même problème. Je n'ai pas pu supprimer la dépendance car elle était requise par le projet principal. Le deuxième projet était un projet de console.

Je suis passé à la bibliothèque de classes , puis tout a fonctionné.

user2971656
la source
Ce commentaire a résolu mon problème. Je vous remercie!
casaout
2

Une autre solution de contournement, au cas où l'exe de dépendance avec le manifeste d'application défectueux ne peut pas être modifié (par exemple, provenant d'un package NuGet). Le binaire peut être inclus en tant que contenu avec une extension factice afin que ClickOnce n'essaie pas de valider le manifeste, puis renommé au démarrage de l'application.

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 Maître
la source
1

J'ai eu le même problème, et j'ai essayé toutes les solutions suggérées précédemment ici, et toutes n'ont pas fonctionné.

Je l'ai corrigé en changeant l'emplacement de mise à jour. Depuis les propriétés du projet -> Publier -> Mises à jour . Remplacez l'emplacement de mise à jour par votre dossier publié.

Majid Alshezawi
la source
1

ÉGALEMENT RÉSOLU POUR ClickOnce .exe appelant .exe appelant .exe.

J'ai également eu ce problème, en utilisant VB.NET dans Visual Studio 2010.

J'ai une application ClickOnce Windows Forms qui fait référence à une deuxième application Windows Forms qui à son tour fait référence à une troisième application Windows Forms. (Ces deuxième et troisième applications sont EXE fichiers plutôt que des fichiers DLL pour plus de simplicité, car elles sont également susceptibles d'être exécutées de manière autonome ou appelées avec des propriétés qui leur sont transmises.)

J'ai dû commenter le contenu du manifeste des deuxième et troisième applications par:

Procédure pas à pas: déploiement manuel d'une application ClickOnce

Cela fonctionne parfaitement.

peter williamson
la source
1

Si vous avez un programme principal qui en référence un autre, vous devez faire l'astuce "Créer une application sans manifeste" sur le programme du programme principal:

Projet -> Propriétés -> Onglet Application -> Ressources -> Manifeste -> menu déroulant "Créer une application sans manifeste"

puis basculez vers les propriétés du projet du programme référencé et répétez le processus.

RoySeberg
la source
0

J'utilise Visual Studio 2012 sur Windows 7 et je dois publier une solution composée de deux projets.

Comme l'a souligné Eduardo, marquer les deux projets comme ClickOnce et activer l'application Full Trust résout le problème.

user819490
la source
0

J'avais un problème un peu différent que j'ai pu résoudre et j'ai donc voulu publier. Mes problèmes étaient que je dirigeais 3 branches sur TFS. J'avais amélioré les contrôles Telerik dans l'une de mes succursales mais pas dans les autres. Une fois que j'ai mis à jour les contrôles Telerik dans les 3 branches et republié, cela a fonctionné et cette erreur a disparu.

J'utilisais VS2015 à l'époque.

Jaredbaszler
la source
0

C'est intéressant. Je viens de redéployer l'application et le problème est résolu. Peut-être une corruption de fichier à cause du réseau.

huseyindotpw
la source
0

J'utilise mage.exepour générer mon manifeste. L'ajout de ceci à mon a .csprojrésolu le problème. Vous pouvez également essayer l' -nowin32manifest indicateur du compilateur ; Je ne l'ai pas testé. Je ne vois pas «Créer une application sans manifeste» de stuartd dans Visual Studio 2017; Je pense que c'est ce qu'il fait cependant.

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

J'ai aussi ceci dans mon .csproj:

<GenerateManifests>false</GenerateManifests>
DharmaTurtle
la source
0

Dans ma version de Visual Studio 2017, version 15.6.6 (mais il y en avait peut-être plus tôt), j'ai trouvé que les fichiers d'application n'étaient pas dans le projet Exe clic droit et publier, mais sous l'onglet Propriétés du projet Publier où vous pouvez définir quels des fichiers d'application que vous souhaitez placer dans l'installation.

Alors éliminez ceux qui posent problème. Si quelque chose est déjà installé sur un ordinateur sur lequel cette application sera installée, il n'y a aucune raison d'essayer de la réinstaller de toute façon, sauf si vous avez besoin de la référence pour qu'elle s'exécute. S'il devait installer ce qui était déjà sur le PC, mais dans un dossier différent, cela pourrait ne pas fonctionner. Il est préférable d'utiliser les autres applications ou les assemblys dll au même emplacement qu'ils étaient précédemment installés.

John Foll
la source
0

J'ai eu le même problème il y a quelques minutes, et voici les étapes que j'ai utilisées pour le résoudre.

Clé

  • a = Projet principal (le projet que vous souhaitez publier, par exemple myProduct)
  • b = Projet de référence (par exemple MyProductSiteServer)

Liste de contrôle

  1. Accédez aux propriétés -> Application -> Ressources -> Vérifiez les icônes et le manifeste (pour a et b)

  2. Accédez aux propriétés -> Build: assurez-vous que a et b sont sur la même plate-forme cible

  3. Accédez à propriétés -> Sécurité et assurez-vous que les paramètres a et b sont cochés: «Activer les paramètres de sécurité ClickOnce» et «Ceci est une application de confiance totale»

  4. Accédez aux propriétés -> Publier: je vous recommande de modifier le chemin du dossier de publication

Kingsley Akpan
la source
0

J'ai eu exactement le même problème avec mon application VS 2019.

J'ai essayé de créer l'application sans manifeste, mais cela n'a pas fonctionné.

Ce qui a fonctionné était cependant le suivant:

  1. Allez dans Construire -> Publier -> Application
  2. Cliquez sur le bouton "Informations d'assemblage"
  3. Cochez l'option "Rendre l'assemblage COM-visible"

Espérons que cela aide!

LaurentiuMa
la source