Errore durante la distribuzione dell'applicazione ClickOnce: il riferimento nel manifesto non corrisponde all'identità dell'assembly scaricato


105

Sto cercando di distribuire un'applicazione ClickOnce, ma l'installazione non riesce sul client. Ecco il registro degli errori:

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 principale che devo distribuire è MyProductFrontDesk.exe, che ha una dipendenza da MyProductSiteServer.exe- e sembra essere il punto in cui viene generato l'errore: "Il riferimento nel manifest non corrisponde all'identità dell'assembly scaricato MyProductSiteServer.exe."

Quale manifest deve essere corretto? E come?


Il progetto MySiteServer.exe si trova nella stessa soluzione Visual Studio di MyProductFrontDesk.exe? In tal caso, la configurazione della build ha entrambi gli assembly selezionati per la compilazione?
Jay

@Jay - sì, nella stessa soluzione, entrambe selezionate per la compilazione.
Shaul Behr

Risposte:


111

Si è verificato un problema con Visual Studio 2008 che viene risolto non incorporando il manifesto predefinito : uno dei commenti su quell'articolo suggerisce che il problema esiste ancora in Visual Studio 2010.

Nelle proprietà del progetto -> scheda Applicazione -> Risorse -> casella di controllo Icona e manifest , l'impostazione "Incorpora manifest con impostazioni predefinite" ha causato il problema. L'impostazione su "Crea applicazione senza manifest" risolve il problema.


Ho trovato particolarmente utile il commento 488301 : l' <assemblyIdentity/>elemento nel manifest personalizzato può essere regolato (o omesso per consentire al compilatore di emettere l'identità dell'assembly corretta) nel .manifestfile personalizzato , consentendo di specificare cose come <requestedExecutionLevel/>senza interrompere ClickOnce.
binki

4
Il mio scenario era un'app GUI che necessitava di una seconda app che fosse un'app console. Se come me preferisci non modificare le impostazioni predefinite, la pubblicazione manuale di quella seconda applicazione ha creato un app.manifest che è apparso nella cartella Proprietà, quindi la pubblicazione di nuovo la prima applicazione ha funzionato senza dover modificare le impostazioni predefinite di incorporamento di un manifest.
aybe

7
Ha avuto lo stesso problema con VS 2013. Questa soluzione ha funzionato.
EagleBeak

2
@EagleBeak dov'è questo menu in VS2013? Non vedo nulla sulla "creazione di un'applicazione senza manifest"
Nefariis

3
A partire da giugno 2016, la risposta corretta è configurare le impostazioni di sicurezza di ClickOnce (vedi risposta pubblicata da Mauro).
Pierre Arnaud

57

Ho avuto lo stesso problema quando ho aggiunto un riferimento a un altro progetto.

Il modo per risolvere questo problema era abilitare le impostazioni di sicurezza di ClickOnce in tutti i progetti a cui si fa riferimento, come Ian ha spiegato qui (enfasi mia):

Per me, il modo in cui questo è stato risolto è stato quello di garantire che tutti i progetti nella soluzione che mostravano la " scheda Sicurezza " nelle loro " Proprietà progetto " avessero l'opzione " Abilita impostazioni di sicurezza ClickOnce " spuntata con l'opzione " Questa è una fiducia totale applicazione "Selezionato. Questo ha a che fare con la creazione corretta del Manifest e l'applicazione non verrà installata se queste opzioni non sono impostate su tutti i Progetti all'interno della Soluzione che lo richiedono.

Credo che questo sia il modo corretto per risolverlo quando si fa riferimento a un altro progetto con la stessa soluzione.

Il post del forum collegato è scaduto, ma è disponibile in archivio qui .


1
Dopo aver provato così tante soluzioni solo questa soluzione funziona per me. Quindi penso anche che questa dovrebbe essere la risposta accettata ...
Tareq

Puoi fare lo stesso modificando il .cprojfile con<PropertyGroup><TargetZone>LocalIntranet</TargetZone></PropertyGroup>
VMAtm

Avevo disabilitato quelle due impostazioni mentre stavo scherzando https://github.com/Squirrel. Quando le mie distribuzioni ClickOnce (non di produzione) hanno smesso di funzionare, mi ero dimenticato di tutto questo.
Walter Stabosz

35

Stavo riscontrando lo stesso problema, ma la mia soluzione era molto diversa.

La mia applicazione ClickOnce faceva riferimento a un altro progetto di file EXE nella mia soluzione, quindi quando il client lo ha scaricato e c'era un altro file EXE, quello non aveva un manifest.

La rimozione della dipendenza da un altro eseguibile ha risolto il mio problema.


2
Ho anche due EXE. La rimozione della dipendenza esclude l'EXE di riferimento dalla generazione. C'è un modo per includerlo?
Uri Abramson

10
Questa era la soluzione per me. Uno dei progetti a cui faceva riferimento il mio EXE principale era esso stesso una "Applicazione Windows". Quando ho cambiato il progetto in "Libreria di classi" e l'ho ripubblicato, tutto ha funzionato.
Chris Ray

Ho usato il suggerimento di @ChrisRay in VS2012 e il programma è stato installato senza alcuna difficoltà. Grazie!
Rolan

1
come cita l'utente @Aybe nei commenti di un'altra risposta, se pubblichi la seconda applicazione fittizia, questa otterrà il proprio manifest e quindi potrai pubblicare la prima applicazione ed entrambi i programmi funzioneranno insieme. (Nel mio caso ho due programmi, uno che chiama l'altro.)
Dave Cousineau

La soluzione per me era davvero entrambe le cose (this e @stuartd): ho un EXE come assembly di riferimento, che non ha un manifest. Ma non posso "rimuovere" questo riferimento perché devo usarlo. Quindi ho dovuto andare al progetto di questa dipendenza EXE, applicare il suggerimento di stuartd. Quindi tutto funziona alla grande.
KFL

11

Ho confermato che il problema esiste anche in Visual Studio 2010. Selezionando "Crea applicazione senza manifest" in Proprietà progetto - Applicazione - Risorse è stato risolto il problema.


8
Solo una nota che ho dovuto modificare questa proprietà sul progetto di cui si lamentava il messaggio di errore, che per me era un progetto a cui fa riferimento il progetto che stavo effettivamente cercando di pubblicare, non il progetto che stavo effettivamente cercando di pubblicare .
Deadlydog

6

Ciò può accadere anche se si hanno due versioni diverse di un pacchetto NuGet a cui si fa riferimento in diversi file DLL nel progetto. Nel mio caso stavo usando un framework chiamato Catel e avevo una versione più recente referenziata in un file DLL rispetto a un altro (supervisione), ma questo ha fatto sì che ClickOnce sputasse questo errore. Fare riferimento alla stessa versione ha risolto il problema.


4

Ho avuto lo stesso problema, ma la mia soluzione era cambiare il "Target della piattaforma" in "x86" (Proprietà del progetto -> Scheda Costruisci). Era impostato su Qualsiasi CPU. Non appena ho cambiato l'impostazione e ho ripubblicato, il programma di installazione di ClickOnce è stato in grado di completare.


1
Problema molto simile: avevo abilitato "Preferisci 32 bit"; spegnendolo ha risolto il problema.
Roman Starkov

4

Ho riscontrato lo stesso errore durante la distribuzione con il progetto impostato su Debug. Quando è stato modificato di nuovo in Release non si sono verificati errori.


4

Ho avuto esattamente lo stesso problema. Non ho potuto rimuovere la dipendenza poiché era necessaria per il progetto principale. Il secondo progetto era un progetto console.

Sono passato alla libreria di classi e poi ha funzionato tutto.


Questo commento ha risolto il mio problema. Grazie!
casaout

2

Un'altra soluzione alternativa, nel caso in cui l'exe di dipendenza con il manifesto dell'app non valido non possa essere modificato (ad esempio proveniente da un pacchetto NuGet). Il file binario può essere incluso come contenuto con un'estensione fittizia, quindi ClickOnce non tenta di convalidare il manifesto e quindi rinominato durante l'avvio dell'app.

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");
        }
    }
}

1

Ho avuto lo stesso problema e ho provato tutte le soluzioni suggerite in precedenza qui, ma tutte non hanno funzionato.

L'ho risolto cambiando la posizione dell'aggiornamento. Dalle proprietà del progetto -> Pubblica -> Aggiornamenti . Cambia il percorso dell'aggiornamento nella cartella pubblicata.


1

RISOLTO ANCHE PER ClickOnce .exe che chiama .exe che chiama .exe.

Ho avuto anche questo problema, utilizzando VB.NET in Visual Studio 2010.

Ho un'applicazione Windows Form ClickOnce che fa riferimento a una seconda applicazione Windows Form che a sua volta fa riferimento a una terza applicazione Windows Form. (Queste seconda e terza applicazione sono file EXE piuttosto che file DLL per semplicità, poiché è altrettanto probabile che vengano eseguite autonomamente o chiamate con le proprietà passate.)

Ho dovuto commentare SIA il contenuto manifest della seconda e della terza applicazione per:

Procedura dettagliata: distribuzione manuale di un'applicazione ClickOnce

Funziona perfettamente.


1

Se hai un programma principale che fa riferimento a un altro, devi eseguire il trucco "Crea applicazione senza manifest" sul Programma del programma principale:

Progetto -> Proprietà -> scheda Applicazione -> Risorse -> Manifest -> menu a discesa "Crea applicazione senza manifest"

e quindi passare alle proprietà del progetto del programma di riferimento e ripetere il processo.


0

Utilizzo Visual Studio 2012 su Windows 7 e devo pubblicare una soluzione composta da due progetti.

Come ha sottolineato Eduardo, contrassegnare entrambi i progetti come ClickOnce e abilitare l'applicazione Full Trust risolve il problema.


0

Avevo un problema leggermente diverso che sono riuscito a risolvere e quindi ho voluto postare. I miei problemi erano che stavo eseguendo 3 rami da TFS. Avevo aggiornato i controlli Telerik in una delle mie filiali ma non negli altri. Dopo aver aggiornato i controlli di Telerik in tutti e 3 i rami e ripubblicato, ha funzionato e questo errore è scomparso.

All'epoca stavo eseguendo VS2015.


0

È interessante. Ho solo ridistribuito l'applicazione e il problema è stato risolto. Forse un file danneggiato a causa della rete.


0

Uso mage.exeper generare il mio manifest. Aggiungendo questo al mio .csprojrisolto il problema. Puoi anche provare il -nowin32manifest flag del compilatore ; Non l'ho provato. Non vedo "Crea applicazione senza manifest" di stuartd in Visual Studio 2017; Penso che questo sia quello che fa però.

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

Ho anche questo nel mio .csproj:

<GenerateManifests>false</GenerateManifests>

0

Nella mia versione di Visual Studio 2017, versione 15.6.6 (ma potrebbe esserci stata prima) ho scoperto che i file dell'applicazione non erano nel progetto Exe con clic destro e pubblica, ma nella scheda Pubblica delle proprietà del progetto dove puoi impostare quale dei file dell'applicazione che si desidera inserire nell'installazione.

Quindi elimina quelli che sono un problema. Se qualcosa è già installato su un computer in cui verrà installata questa app, non c'è motivo di provare a reinstallarlo comunque, a meno che non sia necessario il riferimento per eseguirlo. Se dovesse installare quello che era già sul pc, ma in una cartella diversa potrebbe non funzionare. È preferibile utilizzare le altre applicazioni o gli assembly dll nella stessa posizione in cui sono stati installati in precedenza.


0

Ho avuto lo stesso problema un paio di minuti fa e di seguito sono riportati i passaggi che ho utilizzato per risolverlo.

Chiave

  • a = Progetto principale (il progetto che vuoi pubblicare, es. myProduct)
  • b = Progetto di riferimento (es. MyProductSiteServer)

lista di controllo

  1. Vai a proprietà -> Applicazione -> Risorse -> controlla icone e manifest (sia per a che per b)

  2. Passa a proprietà -> Compila: assicurati che aeb si trovino sulla stessa piattaforma di destinazione

  3. Vai a proprietà -> Sicurezza e assicurati che aeb abbiano queste impostazioni selezionate: "Abilita impostazioni di sicurezza ClickOnce" e "Questa è un'applicazione completamente attendibile"

  4. Vai a proprietà -> Pubblica: ti consiglio di cambiare il percorso della cartella di pubblicazione


0

Ho avuto lo stesso identico problema con la mia applicazione VS 2019.

Ho provato a creare l'applicazione senza un manifest ma non ha funzionato.

Ciò che ha funzionato tuttavia è stato il seguente:

  1. Vai a Compila -> Pubblica -> Applicazione
  2. Fare clic sul pulsante "Informazioni sull'assemblaggio"
  3. Spunta l'opzione "Rendi l'assembly COM-visibile"

Si spera che questo aiuti!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.