Erro ao implantar o aplicativo ClickOnce - A referência no manifesto não corresponde à identidade do assembly baixado

105

Estou tentando implantar um aplicativo ClickOnce, mas a instalação falha no cliente. Aqui está o log de erros:

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.

O exe principal que preciso implantar é MyProductFrontDesk.exe , que depende de MyProductSiteServer.exe- e parece ser onde o erro está sendo lançado: "A referência no manifesto não corresponde à identidade do assembly baixado MyProductSiteServer.exe."

Qual manifesto precisa ser corrigido? E como?

Shaul Behr
fonte
O projeto MySiteServer.exe está na mesma solução do Visual Studio que MyProductFrontDesk.exe? Em caso afirmativo, sua configuração de construção tem ambos os assemblies selecionados para construir?
Jay,
@Jay - sim, na mesma solução, ambos selecionados para construir.
Shaul Behr

Respostas:

111

Houve um problema com o Visual Studio 2008 que foi resolvido ao não incorporar o manifesto padrão - um dos comentários naquele artigo sugere que o problema ainda existe no Visual Studio 2010.

Em propriedades do projeto -> guia Aplicativo -> Recursos -> ícone da caixa de seleção e manifesto , a configuração "Incorporar manifesto com configurações padrão" causou o problema. Configurá-lo para "Criar aplicativo sem manifesto" corrige o problema.

Stuartd
fonte
Achei o comentário 488301 particularmente útil: o <assemblyIdentity/>elemento no manifesto personalizado pode ser ajustado (ou omitido para permitir que o compilador emita a identidade do assembly correta) em seu .manifestarquivo personalizado , permitindo especificar coisas como, por exemplo, <requestedExecutionLevel/>sem quebrar o ClickOnce.
binki
4
Meu cenário era um aplicativo GUI que precisa de um segundo aplicativo que seja um aplicativo de console. Se gosta de mim, você prefere não alterar as configurações padrão, publicando manualmente aquele segundo aplicativo criou um app.manifest que apareceu na pasta Propriedades, em seguida, publicando novamente o primeiro aplicativo funcionou sem ter que alterar as configurações padrão de incorporação de um manifesto.
talvez
7
Tive o mesmo problema com o VS 2013. Esta solução funcionou.
EagleBeak
2
@EagleBeak onde fica esse menu no VS2013? Não vejo nada sobre "criar aplicativo sem manifesto"
Nefariis
3
A partir de junho de 2016, a resposta correta é definir as configurações de segurança do ClickOnce (veja a resposta postada por Mauro).
Pierre Arnaud
57

Tive o mesmo problema quando adicionei uma referência a outro projeto.

A maneira de resolver isso era habilitar as configurações de segurança do ClickOnce em todos os projetos referenciados, conforme Ian explicado aqui (ênfase minha):

Para mim, a maneira como isso foi resolvido foi garantir que todos os projetos na Solução que expusessem a " Guia Segurança " em suas " Propriedades do projeto " tivessem a opção " Ativar configurações de segurança do ClickOnce " marcada com a opção " Esta é uma confiança total aplicativo "Selecionado. Isso tem a ver com a criação correta do Manifesto e o aplicativo não será instalado se essas opções não estiverem configuradas em todos os Projetos da Solução que o requerem.

Acredito que esta seja a maneira adequada de consertar ao fazer uma referência a outro projeto na mesma solução.

A postagem do fórum vinculada já expirou, mas está disponível no arquivo aqui .

Mauro
fonte
1
Depois de tentar tantas soluções, só esta solução funciona para mim. Então eu também acho que esta deve ser a resposta aceita ...
Tareq
Você pode fazer o mesmo modificando o .cprojarquivo com<PropertyGroup><TargetZone>LocalIntranet</TargetZone></PropertyGroup>
VMAtm
Eu havia desabilitado essas duas configurações enquanto estava brincando https://github.com/Squirrel. Quando meu ClickOnce (de não produção) parou de funcionar, eu tinha me esquecido completamente disso.
Walter Stabosz
35

Eu estava enfrentando o mesmo problema, mas minha solução era muito diferente.

Meu aplicativo ClickOnce estava fazendo referência a outro projeto de arquivo EXE em minha solução, então quando o cliente baixou, e havia outro arquivo EXE, aquele não tinha um manifesto.

Remover a dependência de outro executável resolveu meu problema.

skimania
fonte
2
Também tenho dois EXEs. A remoção da dependência exclui o EXE referenciado da compilação. Existe uma maneira de incluí-lo?
Uri Abramson
10
Essa foi a solução para mim. Um dos projetos que meu EXE principal fazia referência era ele próprio um 'Aplicativo do Windows'. Quando mudei esse projeto para 'Biblioteca de classes' e republicou, tudo funcionou.
Chris Ray,
Usei a sugestão do @ChrisRay no VS2012, e o programa foi instalado sem nenhuma dificuldade. Obrigado!
Rolan,
1
como o usuário @Aybe menciona em comentários de outra resposta, se você publicar dummy o segundo aplicativo, ele obterá seu próprio manifesto e então você poderá publicar o primeiro aplicativo e os dois programas funcionarão juntos. (No meu caso, tenho dois programas, um que chama o outro.)
Dave Cousineau
A solução para mim foi realmente as duas coisas (this e @stuartd) - eu tenho um EXE como assembly de referência, que não tem um manifesto. Mas não posso "remover" essa referência porque preciso usá-la. Então eu tive que ir para o projeto dessa dependência EXE, aplicar a sugestão de stuartd. Então tudo funciona muito bem.
KFL
11

Confirmei que o problema também existe no Visual Studio 2010. A seleção de "Criar aplicativo sem manifesto" em Propriedades do projeto - Aplicativo - Recursos resolveu o problema.

Eduardo
fonte
8
Apenas uma observação que eu tive que alterar essa propriedade no projeto sobre o qual a mensagem de erro estava reclamando, que para mim era um projeto sendo referenciado pelo projeto que eu estava tentando publicar, não o projeto que eu estava tentando publicar .
deadlydog
6

Isso também pode acontecer se você tiver duas versões diferentes de um pacote NuGet referenciado em arquivos DLL diferentes em seu projeto. No meu caso, eu estava usando uma estrutura chamada Catel e tinha uma versão mais recente referenciada em um arquivo DLL do que em outro (descuido), mas isso fez o ClickOnce cuspir esse erro. Fazer referência à mesma versão resolveu o problema.

Bitfiddler
fonte
4

Eu tive o mesmo problema, mas minha solução foi mudar o 'destino da plataforma' para 'x86' (Propriedades do projeto -> guia Compilar). Ele foi definido como Qualquer CPU. Assim que alterei a configuração e publiquei novamente, o instalador do ClickOnce foi concluído.

Paul Whygle
fonte
1
Problema muito semelhante: eu tinha "Preferir 32 bits" habilitado; desligá-lo corrigiu o problema.
Roman Starkov,
4

Eu experimentei o mesmo erro ao implantar com o projeto definido como Debug. Quando foi alterado de volta para Release, não houve erro.

Dave
fonte
4

Eu tive exatamente o mesmo problema. Não consegui remover a dependência porque ela era necessária para o projeto principal. O segundo projeto foi um projeto de console.

Mudei para a Biblioteca de classes e tudo funcionou.

user2971656
fonte
Este comentário corrigiu meu problema. Obrigado!
casaout
2

Outra solução alternativa, caso o exe de dependência com o manifesto do aplicativo inválido não possa ser alterado (digamos, vindo de um pacote NuGet). O binário pode ser incluído como conteúdo com uma extensão fictícia para que ClickOnce não tente validar o manifesto e, em seguida, renomeado durante a inicialização do aplicativo.

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
fonte
1

Eu tive o mesmo problema e tentei todas as soluções sugeridas anteriormente aqui, mas todas não funcionaram.

Consertei alterando o local de atualização. Nas propriedades do projeto -> Publicar -> Atualizações . Altere o local de atualização para a pasta publicada.

Majid Alshezawi
fonte
1

TAMBÉM RESOLVIDO PARA ClickOnce .exe chamando .exe chamando .exe.

Eu tive esse problema também, usando VB.NET no Visual Studio 2010.

Eu tenho um aplicativo ClickOnce Windows Forms que faz referência a um segundo aplicativo Windows Forms que, por sua vez, faz referência a um terceiro aplicativo Windows Forms. (Esses segundo e terceiro aplicativos são arquivos EXE em vez de arquivos DLL para simplificar, pois têm a mesma probabilidade de serem executados de forma autônoma ou chamados com propriedades passadas a eles.)

Tive que comentar AMBOS o conteúdo do manifesto do segundo e do terceiro aplicativo por:

Passo a passo: Implantando manualmente um aplicativo ClickOnce

Funciona perfeitamente.

Peter Williamson
fonte
1

Se você tiver um programa principal que faz referência a outro, deverá executar o truque "Criar aplicativo sem manifesto" no programa do programa principal:

Projeto -> Propriedades -> Guia Aplicativo -> Recursos -> Manifesto -> menu suspenso "Criar aplicativo sem manifesto"

e então mude para as Propriedades do Projeto do programa referenciado e repita o processo.

RoySeberg
fonte
0

Estou usando o Visual Studio 2012 no Windows 7 e preciso publicar uma solução que consiste em dois projetos.

Como Eduardo apontou, marcar os dois projetos como ClickOnce e ativar o aplicativo Full Trust resolve o problema.

user819490
fonte
0

Tive um problema diferente que consegui resolver e por isso queria postar. Meu problema era que eu estava executando 3 branches do TFS. Eu havia atualizado os controles da Telerik em uma de minhas filiais, mas não nas outras. Depois de atualizar os controles do Telerik em todos os 3 branches e publicar novamente, ele funcionou e esse erro foi embora.

Eu estava executando o VS2015 na época.

Jaredbaszler
fonte
0

É interessante. Acabei de reimplantar o aplicativo e o problema foi resolvido. Talvez um arquivo corrompido por causa da rede.

Huseyindotpw
fonte
0

Eu uso mage.exepara gerar meu manifesto. Adicionar isso ao meu .csprojcorrigiu o problema. Você também pode tentar o -nowin32manifest sinalizador do compilador ; Eu não testei. Não vejo "Criar aplicativo sem manifesto" de stuartd no Visual Studio 2017; Eu acho que é isso que ele faz.

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

Eu também tenho isso no meu .csproj:

<GenerateManifests>false</GenerateManifests>
DharmaTurtle
fonte
0

Na minha versão do Visual Studio 2017, versão 15.6.6 (mas pode estar lá antes), descobri que os arquivos do aplicativo não estavam no botão direito Exe Project and Publish, mas na guia Publish das propriedades do projeto, onde você pode definir quais dos arquivos do aplicativo que você deseja incluir na instalação.

Portanto, elimine os que são um problema. Se algo já estiver instalado em um computador onde este aplicativo será instalado, não há razão para tentar reinstalá-lo de qualquer maneira, exceto se você precisar da referência para que ele seja executado. Se fosse para instalar o que já estava no pc, mas em uma pasta diferente, pode não funcionar. É melhor usar os outros aplicativos ou assemblies dll no mesmo local em que foram instalados anteriormente.

John Foll
fonte
0

Tive o mesmo problema alguns minutos atrás e, a seguir, estão as etapas que usei para resolvê-lo.

Chave

  • a = Projeto principal (o projeto que você deseja publicar, por exemplo, myProduct)
  • b = Projeto de referência (por exemplo, MyProductSiteServer)

Lista de controle

  1. Navegue até propriedades -> Aplicativo -> Recursos -> ícones de verificação e manifesto (para a e b)

  2. Navegue até propriedades -> Construir: certifique-se de que a e b estão na mesma plataforma de destino

  3. Navegue até propriedades -> Segurança e certifique-se de que aeb tenham estas configurações marcadas: "Ativar configurações de segurança ClickOnce" e "Este é um aplicativo de confiança total"

  4. Navegue até propriedades -> Publicar: eu recomendo que você altere o caminho da pasta de publicação

Kingsley Akpan
fonte
0

Eu tive exatamente o mesmo problema com meu aplicativo VS 2019.

Tentei criar o aplicativo sem um manifesto, mas isso não funcionou.

O que funcionou, no entanto, foi o seguinte:

  1. Vá para Build -> Publish -> Application
  2. Clique no botão "Informações de montagem"
  3. Marque a opção "Make assembly COM-Visible" opção

Esperançosamente, isso ajuda!

LaurentiuMa
fonte