Fehler beim Bereitstellen der ClickOnce-Anwendung - Die Referenz im Manifest stimmt nicht mit der Identität der heruntergeladenen Assembly überein

104

Ich versuche, eine ClickOnce-Anwendung bereitzustellen, aber die Installation auf dem Client schlägt fehl. Hier ist das Fehlerprotokoll:

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.

Die wichtigste Exe, die ich bereitstellen muss, ist eine MyProductFrontDesk.exe, von der eine Abhängigkeit besteht MyProductSiteServer.exe- und an der anscheinend der Fehler ausgelöst wird: "Die Referenz im Manifest stimmt nicht mit der Identität der heruntergeladenen Assembly MyProductSiteServer.exe überein."

Welches Manifest muss korrigiert werden? Und wie?

Shaul Behr
quelle
Befindet sich das MySiteServer.exe-Projekt in derselben Visual Studio-Lösung wie MyProductFrontDesk.exe? Wenn ja, sind in Ihrer Build-Konfiguration beide Assemblys zum Erstellen ausgewählt?
Jay
@ Jay - ja, in derselben Lösung, beide zum Erstellen ausgewählt.
Shaul Behr

Antworten:

111

Es gab ein Problem mit Visual Studio 2008, das behoben wurde, indem das Standardmanifest nicht eingebettet wurde. Einer der Kommentare zu diesem Artikel weist darauf hin, dass das Problem in Visual Studio 2010 weiterhin besteht.

In den Projekteigenschaften -> Registerkarte Anwendung -> Ressourcen -> Kontrollkästchen Symbol und Manifest verursachte die Einstellung "Manifest mit Standardeinstellungen einbetten" das Problem. Wenn Sie "Anwendung ohne Manifest erstellen" festlegen, wird das Problem behoben.

stuartd
quelle
Ich fand den Kommentar 488301 besonders nützlich: Das <assemblyIdentity/>Element im benutzerdefinierten Manifest kann in Ihrer benutzerdefinierten .manifestDatei angepasst (oder weggelassen werden, damit der Compiler die richtige Assemblyidentität ausgibt) , sodass Sie beispielsweise Dinge angeben können, <requestedExecutionLevel/>ohne ClickOnce zu beschädigen.
Binki
4
Mein Szenario war eine GUI-App, die eine zweite App benötigt, die eine Konsolen-App ist. Wenn Sie wie ich die Standardeinstellungen lieber nicht ändern möchten, indem Sie die zweite Anwendung manuell veröffentlichen, wird ein app.manifest erstellt, das im Ordner "Eigenschaften" angezeigt wird, und die erste Anwendung erneut veröffentlicht, ohne dass die Standardeinstellungen für das Einbetten eines Manifests geändert werden müssen.
Aybe
7
Hatte das gleiche Problem mit VS 2013. Diese Lösung hat funktioniert.
EagleBeak
2
@EagleBeak wo ist dieses Menü in VS2013? Ich sehe nichts über "Erstellen einer Anwendung ohne Manifest"
Nefariis
3
Ab Juni 2016 besteht die richtige Antwort darin, die ClickOnce-Sicherheitseinstellungen zu konfigurieren (siehe Antwort von Mauro).
Pierre Arnaud
57

Ich hatte das gleiche Problem, als ich einen Verweis auf ein anderes Projekt hinzufügte.

Der Weg, dies zu lösen, bestand darin, die ClickOnce-Sicherheitseinstellungen in allen referenzierten Projekten zu aktivieren , wie Ian hier erklärte (Hervorhebung von mir):

Für mich ist dies die Art und Weise gelöst wurde , war um sicherzustellen , dass alle Projekte im Rahmen der Lösung , die die „ausgesetzt Registerkarte Sicherheit “ in ihrem „ Projekteigenschaften “ die Option hatte „ aktivieren Clickonce Security Settings "“Ticked mit der Option Dies ist ein volles Vertrauen Anwendung "Ausgewählt. Dies hat mit der korrekten Erstellung des Manifests zu tun, und die Anwendung wird nicht installiert, wenn diese Optionen nicht für alle Projekte in der Lösung festgelegt sind, für die dies erforderlich ist.

Ich glaube, dies ist der richtige Weg, um das Problem zu beheben, wenn auf ein anderes Projekt unter derselben Lösung verwiesen wird.

Der verlinkte Forumsbeitrag ist inzwischen abgelaufen, steht aber hier im Archiv zur Verfügung .

Mauro
quelle
1
Nachdem ich so viele Lösungen ausprobiert habe, funktioniert nur diese Lösung für mich. Also ich denke auch, dass dies die akzeptierte Antwort sein sollte ...
Tareq
Sie können das gleiche tun, .cproj<PropertyGroup><TargetZone>LocalIntranet</TargetZone></PropertyGroup>
indem Sie
Ich hatte diese beiden Einstellungen deaktiviert, während ich herumgespielt habe https://github.com/Squirrel. Als meine (nicht produktiven) ClickOnce-Bereitstellungen nicht mehr funktionierten, hatte ich alles vergessen.
Walter Stabosz
35

Ich hatte das gleiche Problem, aber meine Lösung war sehr unterschiedlich.

Meine ClickOnce-Anwendung hat in meiner Lösung auf ein anderes EXE-Dateiprojekt verwiesen. Als der Client es herunterlud und es eine andere EXE-Datei gab, hatte diese kein Manifest.

Das Entfernen der Abhängigkeit von einer anderen ausführbaren Datei löste mein Problem.

Skimania
quelle
2
Ich habe auch zwei EXE. Durch das Entfernen der Abhängigkeit wird die referenzierte EXE-Datei vom Build ausgeschlossen. Gibt es eine Möglichkeit, es aufzunehmen?
Uri Abramson
10
Das war die Lösung für mich. Eines der Projekte, auf die meine Haupt-EXE verwies, war selbst eine 'Windows-Anwendung'. Als ich dieses Projekt in "Klassenbibliothek" änderte und erneut veröffentlichte, funktionierte alles.
Chris Ray
Ich habe den Vorschlag von @ChrisRay in VS2012 verwendet und das Programm ohne Schwierigkeiten installiert. Vielen Dank!
Rolan
1
Wie Benutzer @Aybe in den Kommentaren einer anderen Antwort erwähnt, erhält die Dummy-Veröffentlichung der zweiten Anwendung ein eigenes Manifest. Anschließend können Sie die erste Anwendung veröffentlichen, und beide Programme arbeiten zusammen. (In meinem Fall habe ich zwei Programme, eines, das das andere aufruft.)
Dave Cousineau
Die Lösung für mich war wirklich beides (dies und @stuartd) - ich habe eine EXE als Referenzassembly, die kein Manifest hat. Aber ich kann diese Referenz nicht "entfernen", weil ich sie verwenden muss. Also musste ich zum Projekt dieser EXE-Abhängigkeit gehen und den Vorschlag von stuartd anwenden. Dann funktioniert alles super.
KFL
11

Ich habe bestätigt, dass das Problem auch in Visual Studio 2010 besteht. Durch Auswahl von "Anwendung ohne Manifest erstellen" in Projekteigenschaften - Anwendung - Ressourcen wurde das Problem behoben.

Eduardo
quelle
8
Nur ein Hinweis, dass ich diese Eigenschaft für das Projekt ändern musste, über das sich die Fehlermeldung beschwerte. Für mich war dies ein Projekt, auf das von dem Projekt verwiesen wurde, das ich tatsächlich zu veröffentlichen versuchte, und nicht von dem Projekt, das ich tatsächlich zu veröffentlichen versuchte .
tödlicher Hund
6

Dies kann auch passieren, wenn Sie zwei verschiedene Versionen eines NuGet- Pakets haben, auf die in verschiedenen DLL-Dateien in Ihrem Projekt verwiesen wird. In meinem Fall verwendete ich ein Framework namens Catel und hatte eine neuere Version, auf die in einer DLL-Datei verwiesen wurde als in einer anderen (Versehen), aber dies führte dazu, dass ClickOnce diesen Fehler ausspuckte. Durch Verweisen auf dieselbe Version wurde das Problem behoben.

Bitfiddler
quelle
4

Ich hatte das gleiche Problem, aber meine Lösung bestand darin, das "Plattformziel" in "x86" zu ändern (Projekteigenschaften -> Registerkarte "Erstellen"). Es wurde auf Beliebige CPU eingestellt. Sobald ich die Einstellung geändert und erneut veröffentlicht hatte, konnte das ClickOnce-Installationsprogramm abgeschlossen werden.

Paul Whygle
quelle
1
Sehr ähnliches Problem: Ich hatte "32-Bit bevorzugen" aktiviert; Durch Ausschalten wurde das Problem behoben.
Roman Starkov
4

Beim Bereitstellen mit dem auf Debug eingestellten Projekt ist der gleiche Fehler aufgetreten. Als es wieder auf Release geändert wurde, gab es keinen Fehler.

Dave
quelle
4

Ich hatte genau das gleiche Problem. Ich konnte die Abhängigkeit nicht entfernen, da sie vom Hauptprojekt benötigt wurde. Das zweite Projekt war ein Konsolenprojekt.

Ich wechselte zur Klassenbibliothek und dann funktionierte alles.

user2971656
quelle
Dieser Kommentar hat mein Problem behoben. Danke dir!
Casaout
2

Eine weitere Problemumgehung für den Fall, dass die Abhängigkeitsexe mit dem Manifest der fehlerhaften App nicht geändert werden kann (z. B. aus einem NuGet-Paket). Die Binärdatei kann als Inhalt in eine Dummy-Erweiterung aufgenommen werden, sodass ClickOnce nicht versucht, das Manifest zu validieren und es dann beim Start der App umzubenennen.

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

Ich hatte das gleiche Problem und habe alle zuvor vorgeschlagenen Lösungen hier ausprobiert, und alle haben nicht funktioniert.

Ich habe es behoben, indem ich den Speicherort des Updates geändert habe. Über Projekteigenschaften -> Veröffentlichen -> Updates . Ändern Sie den Aktualisierungsspeicherort in Ihren veröffentlichten Ordner.

Majid Alshezawi
quelle
1

AUCH GELÖST FÜR ClickOnce .exe Aufruf .exe Aufruf .exe.

Ich hatte dieses Problem auch bei der Verwendung von VB.NET in Visual Studio 2010.

Ich habe eine ClickOnce Windows Forms-Anwendung, die auf eine zweite Windows Forms-Anwendung verweist, die wiederum auf eine dritte Windows Forms-Anwendung verweist. (Diese zweite und dritte Anwendung sind EXE Einfachheit halber Dateien und keine DLL-Dateien, da sie wahrscheinlich auch eigenständig ausgeführt oder mit an sie übergebenen Eigenschaften aufgerufen werden.)

Ich musste BEIDEN Inhalt der zweiten und dritten Anwendung auskommentieren :

Exemplarische Vorgehensweise: Manuelles Bereitstellen einer ClickOnce-Anwendung

Es funktioniert perfekt.

Peter Williamson
quelle
1

Wenn Sie ein Hauptprogramm haben, das auf ein anderes verweist, müssen Sie den Trick "Anwendung ohne Manifest erstellen" im Programm des Hauptprogramms ausführen:

Projekt -> Eigenschaften -> Registerkarte Anwendung -> Ressourcen -> Manifest -> Dropdown-Liste "Anwendung ohne Manifest erstellen"

Wechseln Sie dann zu den Projekteigenschaften des referenzierten Programms und wiederholen Sie den Vorgang.

RoySeberg
quelle
0

Ich verwende Visual Studio 2012 unter Windows 7 und muss eine Lösung veröffentlichen, die aus zwei Projekten besteht.

Wie Eduardo betonte, wird das Problem behoben, indem beide Projekte als ClickOnce markiert und die Full Trust-Anwendung aktiviert werden.

user819490
quelle
0

Ich hatte ein etwas anderes Problem, das ich lösen konnte, und deshalb wollte ich etwas posten. Meine Probleme waren, dass ich 3 Filialen von TFS aus betrieben habe. Ich hatte die Telerik-Steuerung in einer meiner Niederlassungen aktualisiert, in den anderen jedoch nicht. Nachdem ich die Telerik-Steuerelemente in allen drei Zweigen aktualisiert und erneut veröffentlicht hatte, funktionierte sie und dieser Fehler verschwand.

Ich habe damals VS2015 ausgeführt.

jaredbaszler
quelle
0

Es ist interessant. Ich habe gerade die Anwendung erneut bereitgestellt und das Problem gelöst. Möglicherweise eine Dateibeschädigung aufgrund des Netzwerks.

huseyindotpw
quelle
0

Ich benutze mage.exe, um mein Manifest zu generieren. Das Hinzufügen zu meinem hat .csprojdas Problem behoben. Sie können auch das -nowin32manifest Compiler-Flag ausprobieren . Ich habe es nicht getestet. Ich sehe stuartds "Anwendung ohne Manifest erstellen" in Visual Studio 2017 nicht. Ich denke, das ist es, was es tut.

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

Ich habe dies auch in meinem .csproj:

<GenerateManifests>false</GenerateManifests>
DharmaTurtle
quelle
0

In meiner Version von Visual Studio 2017, Version 15.6.6 (aber möglicherweise schon früher), habe ich festgestellt, dass sich die Anwendungsdateien nicht in der rechten Maustaste auf Projekt exe und veröffentlichen befinden, sondern auf der Registerkarte Veröffentlichen von Projekteigenschaften, auf der Sie festlegen können, welche der Anwendungsdateien, die Sie in die Installation einfügen möchten.

Nehmen Sie also diejenigen heraus, die ein Problem darstellen. Wenn auf einem Computer, auf dem diese App installiert wird, bereits etwas installiert ist, gibt es keinen Grund, eine Neuinstallation zu versuchen, es sei denn, Sie benötigen die Referenz, damit sie ausgeführt werden kann. Wenn es installiert, was sich bereits auf dem PC befand, aber in einem anderen Ordner, funktioniert es möglicherweise nicht. Es ist am besten, die anderen Anwendungen oder DLL-Assemblys am selben Speicherort zu verwenden, an dem sie zuvor installiert wurden.

John Foll
quelle
0

Ich hatte vor ein paar Minuten das gleiche Problem. Nachfolgend sind die Schritte aufgeführt, mit denen ich es gelöst habe.

Schlüssel

  • a = Hauptprojekt (das Projekt, das Sie veröffentlichen möchten, z. B. myProduct)
  • b = Referenzprojekt (zB MyProductSiteServer)

Checkliste

  1. Navigieren Sie zu Eigenschaften -> Anwendung -> Ressourcen -> Symbole und Manifest überprüfen (für a und b).

  2. Navigieren Sie zu Eigenschaften -> Erstellen: Stellen Sie sicher, dass sich a und b auf derselben Zielplattform befinden

  3. Navigieren Sie zu Eigenschaften -> Sicherheit und stellen Sie sicher, dass a und b die folgenden Einstellungen aktiviert haben: "ClickOnce-Sicherheitseinstellungen aktivieren" und "Dies ist eine voll vertrauenswürdige Anwendung".

  4. Navigieren Sie zu Eigenschaften -> Veröffentlichen: Ich empfehle, den Pfad des Veröffentlichungsordners zu ändern

Kingsley Akpan
quelle
0

Ich hatte genau das gleiche Problem mit meiner VS 2019-Anwendung.

Ich habe versucht, die Anwendung ohne Manifest zu erstellen, aber das hat nicht funktioniert.

Was jedoch funktionierte, war Folgendes:

  1. Gehen Sie zu Erstellen -> Veröffentlichen -> Anwendung
  2. Klicken Sie auf die Schaltfläche "Baugruppeninformationen"
  3. Aktivieren Sie die Option "Baugruppe COM-sichtbar machen"

Hoffentlich hilft das!

LaurentiuMa
quelle