Błąd podczas wdrażania aplikacji ClickOnce - odwołanie w manifeście nie jest zgodne z tożsamością pobranego zestawu

105

Próbuję wdrożyć aplikację ClickOnce, ale instalacja kończy się niepowodzeniem na kliencie. Oto dziennik błędów:

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.

Główny plik exe, który muszę wdrożyć MyProductFrontDesk.exe, jest zależny od MyProductSiteServer.exe- i wygląda na to, że jest tam zgłaszany błąd: „Odwołanie w manifeście nie jest zgodne z tożsamością pobranego zestawu MyProductSiteServer.exe”.

Który manifest należy poprawić? I jak?

Shaul Behr
źródło
Czy projekt MySiteServer.exe znajduje się w tym samym rozwiązaniu programu Visual Studio co MyProductFrontDesk.exe? Jeśli tak, czy konfiguracja kompilacji ma oba zestawy wybrane do kompilacji?
Jay
@Jay - tak, w tym samym rozwiązaniu, oba wybrane do zbudowania.
Shaul Behr

Odpowiedzi:

111

Wystąpił problem z Visual Studio 2008, który można rozwiązać, nie osadzając domyślnego manifestu - jeden z komentarzy do tego artykułu sugeruje, że problem nadal istnieje w programie Visual Studio 2010.

We właściwościach projektu -> zakładka Aplikacja -> Zasoby -> pole wyboru Ikona i manifest , ustawienie „Osadź manifest z ustawieniami domyślnymi” spowodowało problem. Ustawienie opcji „Utwórz aplikację bez manifestu” rozwiązuje problem.

stuartd
źródło
Uważam, że komentarz 488301 jest szczególnie przydatny: <assemblyIdentity/>element w niestandardowym manifeście można dostosować (lub pominąć, aby umożliwić kompilatorowi emitowanie poprawnej tożsamości zestawu) w .manifestpliku niestandardowym , umożliwiając określenie takich rzeczy, jak <requestedExecutionLevel/>bez przerywania ClickOnce.
binki
4
Mój scenariusz to aplikacja GUI, która wymaga drugiej aplikacji, czyli aplikacji konsoli. Jeśli tak jak ja wolałbyś nie zmieniać ustawień domyślnych, ręczne publikowanie drugiej aplikacji spowodowało utworzenie manifestu aplikacji, który pojawił się w folderze Właściwości, a następnie ponowne opublikowanie pierwszej aplikacji działało bez konieczności zmiany domyślnych ustawień osadzania manifestu.
aybe
7
Miałem ten sam problem z VS 2013. To rozwiązanie zadziałało.
EagleBeak,
2
@EagleBeak gdzie jest to menu w VS2013? Nie widzę nic o „tworzeniu aplikacji bez manifestu”
Nefariis
3
Od czerwca 2016 r. Poprawną odpowiedzią jest skonfigurowanie ustawień zabezpieczeń ClickOnce (zobacz odpowiedź opublikowaną przez Mauro).
Pierre Arnaud
57

Miałem ten sam problem, kiedy dodałem odniesienie do innego projektu.

Sposób rozwiązania tego problemu polegał na włączeniu ustawień zabezpieczeń ClickOnce we wszystkich przywoływanych projektach, jak wyjaśnił Ian tutaj (wyróżnienie moje):

Dla mnie sposobem rozwiązania tego problemu było zapewnienie, że wszystkie projekty w ramach rozwiązania, które ujawniły „ kartę Zabezpieczenia ” w swoich „ właściwościach projektu ”, miały opcję „ Włącz ustawienia zabezpieczeń ClickOnce ” zaznaczoną opcją „ To jest pełne zaufanie aplikacja „Wybrano. Ma to związek z poprawnym utworzeniem Manifestu, a aplikacja nie zostanie zainstalowana, jeśli te opcje nie są ustawione we wszystkich projektach w ramach rozwiązania, które tego wymagają.

Uważam, że jest to właściwy sposób na naprawienie tego problemu podczas tworzenia odniesienia do innego projektu w ramach tego samego rozwiązania.

Post na forum, do którego prowadzi link, już wygasł, ale jest dostępny w archiwum tutaj .

Mauro
źródło
1
Po wypróbowaniu tylu rozwiązań tylko to rozwiązanie działa dla mnie. Więc myślę, że to powinna być akceptowana odpowiedź ...
Tareq,
Możesz zrobić to samo, modyfikując .cprojplik za pomocą<PropertyGroup><TargetZone>LocalIntranet</TargetZone></PropertyGroup>
VMAtm
Wyłączyłem te dwa ustawienia, kiedy się wygłupiałem https://github.com/Squirrel. Kiedy moje (nieprodukcyjne) wdrożenia ClickOnce przestały działać, zapomniałem o tym.
Walter Stabosz
35

Miałem ten sam problem, ale moje rozwiązanie było zupełnie inne.

Moja aplikacja ClickOnce odwoływała się do innego projektu pliku EXE w moim rozwiązaniu, więc gdy klient ją pobrał i był inny plik EXE, ten nie miał manifestu.

Usunięcie zależności od innego pliku wykonywalnego rozwiązało mój problem.

skimania
źródło
2
Mam też dwa EXE. Usunięcie zależności wyklucza odwoływany plik EXE z kompilacji. Czy jest sposób, aby to uwzględnić?
Uri Abramson
10
To było dla mnie rozwiązanie. Jednym z projektów, do których odwoływał się mój główny plik EXE, była sama „aplikacja Windows”. Kiedy zmieniłem ten projekt na „Class Library” i ponownie opublikowałem, wszystko działało.
Chris Ray
Skorzystałem z sugestii @ChrisRay w VS2012 i program został zainstalowany bez żadnych trudności. Dzięki!
Rolan
1
jak wspomina użytkownik @Aybe w komentarzach innej odpowiedzi, jeśli fałszywie opublikujesz drugą aplikację, otrzyma ona swój własny manifest, a następnie będziesz mógł opublikować pierwszą aplikację i oba programy będą ze sobą współpracować. (W moim przypadku mam dwa programy, jeden, który wywołuje drugi.)
Dave Cousineau
Rozwiązaniem dla mnie było naprawdę oba (this i @stuartd) - mam plik EXE jako zestaw referencyjny, który nie ma manifestu. Ale nie mogę „usunąć” tego odniesienia, ponieważ muszę go użyć. Musiałem więc przejść do projektu tej zależności EXE, zastosować sugestię stuartda. Wtedy wszystko działa świetnie.
KFL
11

Potwierdziłem, że problem istnieje również w programie Visual Studio 2010. Wybranie opcji „Utwórz aplikację bez manifestu” we Właściwościach projektu - Aplikacja - Zasoby rozwiązało problem.

Eduardo
źródło
8
Tylko uwaga, że ​​musiałem zmienić tę właściwość w projekcie, na który narzekał komunikat o błędzie, który dla mnie był projektem, do którego odwołuje się projekt, który faktycznie próbowałem opublikować, a nie projekt, który faktycznie próbowałem opublikować .
deadlydog
6

Może się to również zdarzyć, jeśli w projekcie istnieją dwie różne wersje pakietu NuGet, do których istnieją odwołania w różnych plikach DLL. W moim przypadku używałem frameworka o nazwie Catel i miałem odwołanie do nowszej wersji w jednym pliku DLL niż w innym (przeoczenie), ale spowodowało to, że ClickOnce wypluł ten błąd. Odwołanie się do tej samej wersji rozwiązało problem.

Bitfiddler
źródło
4

Miałem ten sam problem, ale moim rozwiązaniem była zmiana „Platformy docelowej” na „x86” (Właściwości projektu -> Karta Kompilacja). Był ustawiony na Dowolny procesor. Gdy tylko zmieniłem ustawienie i ponownie opublikowałem, instalator ClickOnce był w stanie zakończyć.

Paul Whygle
źródło
1
Bardzo podobny problem: miałem włączoną opcję „Preferuj wersję 32-bitową”; wyłączenie go rozwiązało problem.
Roman Starkov
4

Wystąpił ten sam błąd podczas wdrażania z projektem ustawionym na debugowanie. Po zmianie z powrotem na Release nie było błędu.

Dave
źródło
4

Miałem dokładnie ten sam problem. Nie mogłem usunąć zależności, ponieważ była potrzebna w głównym projekcie. Drugi projekt był projektem konsoli.

Przerzuciłem się na Class Library i wszystko się udało.

user2971656
źródło
Ten komentarz rozwiązał mój problem. Dziękuję Ci!
casaout
2

Innym obejściem problemu jest to, że nie można zmienić pliku exe zależności z manifestem złej aplikacji (na przykład pochodzącym z pakietu NuGet). Plik binarny można dołączyć jako zawartość z fikcyjnym rozszerzeniem, więc ClickOnce nie próbuje sprawdzać poprawności manifestu, a następnie zmienia nazwę podczas uruchamiania aplikacji.

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
źródło
1

Miałem ten sam problem i wypróbowałem tutaj wszystkie poprzednie sugerowane rozwiązania i wszystkie z nich nie działały.

Naprawiłem to, zmieniając lokalizację aktualizacji. Z właściwości projektu -> Publikuj -> Aktualizacje . Zmień lokalizację aktualizacji na opublikowany folder.

Majid Alshezawi
źródło
1

ROZWIĄZANE RÓWNIEŻ DLA ClickOnce .exe wywołującego .exe wywołującego .exe.

Miałem też ten problem, używając VB.NET w Visual Studio 2010.

Mam aplikację ClickOnce Windows Forms, która odwołuje się do drugiej aplikacji Windows Forms, która z kolei odwołuje się do trzeciej aplikacji Windows Forms. (Te druga i trzecia aplikacja są raczej plikami EXE , a nie plikami DLL dla uproszczenia, ponieważ równie prawdopodobne jest, że będą uruchamiane samodzielnie lub wywoływane z przekazanymi do nich właściwościami).

Musiałem skomentować zawartość manifestu zarówno drugiej, jak i trzeciej aplikacji na:

Przewodnik: ręczne wdrażanie aplikacji ClickOnce

Działa doskonale.

peter williamson
źródło
1

Jeśli masz jeden program główny, który odwołuje się do innego, musisz wykonać sztuczkę „Utwórz aplikację bez manifestu” w programie głównym programu:

Projekt -> Właściwości -> Karta aplikacji -> Zasoby -> Manifest -> lista rozwijana „Utwórz aplikację bez manifestu”

a następnie przełącz się na właściwości projektu przywoływanego programu i powtórz proces.

RoySeberg
źródło
0

Używam programu Visual Studio 2012 w systemie Windows 7 i muszę opublikować rozwiązanie składające się z dwóch projektów.

Jak zauważył Eduardo, oznaczenie obu projektów jako ClickOnce i włączenie aplikacji pełnego zaufania rozwiązuje problem.

user819490
źródło
0

Miałem trochę inny problem, który udało mi się rozwiązać, więc chciałem opublikować. Moje problemy polegały na tym, że uruchomiłem 3 gałęzie z TFS. Zaktualizowałem sterowniki Telerik w jednym z moich oddziałów, ale nie w pozostałych. Po uaktualnieniu kontrolek Telerik we wszystkich 3 gałęziach i ponownym opublikowaniu wszystko zadziałało i ten błąd zniknął.

W tym czasie korzystałem z VS2015.

jaredbaszler
źródło
0

To interesujące. Po prostu ponownie wdrażam aplikację i problem został rozwiązany. Może uszkodzenie pliku z powodu sieci.

huseyindotpw
źródło
0

Używam mage.exedo generowania manifestu. Dodanie tego do mojego .csprojrozwiązało problem. Możesz także wypróbować -nowin32manifest flagę kompilatora ; Nie testowałem tego. Nie widzę opcji „Utwórz aplikację bez manifestu” stuartda w programie Visual Studio 2017; Myślę, że to właśnie robi.

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

Mam też to w swoim .csproj:

<GenerateManifests>false</GenerateManifests>
DharmaTurtle
źródło
0

W mojej wersji programu Visual Studio 2017 w wersji 15.6.6 (ale mogło istnieć tam wcześniej) stwierdziłem, że pliki aplikacji nie znajdowały się w projekcie Exe prawym przyciskiem myszy i publikowaniu, ale na karcie Publikuj właściwości projektu, w której można ustawić, które plików aplikacji, które chcesz umieścić w instalacji.

Więc usuń te, które stanowią problem. Jeśli coś jest już zainstalowane na komputerze, na którym zostanie zainstalowana ta aplikacja, nie ma powodu, aby próbować ją ponownie zainstalować, chyba że potrzebujesz odniesienia do uruchomienia. Gdyby zainstalował to, co było już na komputerze, ale do innego folderu, mogłoby to nie zadziałać. Najlepiej jest używać innych aplikacji lub zestawów dll w tej samej lokalizacji, w której zostały wcześniej zainstalowane.

John Foll
źródło
0

Kilka minut temu miałem ten sam problem, a poniżej znajdują się kroki, które zastosowałem, aby go rozwiązać.

Klucz

  • a = Projekt główny (projekt, który chcesz opublikować, np. myProduct)
  • b = Projekt referencyjny (np. MyProductSiteServer)

Lista kontrolna

  1. Przejdź do właściwości -> Aplikacja -> Zasoby -> sprawdź ikony i manifest (zarówno dla a i b)

  2. Przejdź do właściwości -> Kompiluj: upewnij się, że a i b znajdują się na tej samej platformie docelowej

  3. Przejdź do właściwości -> Zabezpieczenia i upewnij się, że a i b mają zaznaczone te ustawienia: „Włącz ustawienia zabezpieczeń ClickOnce” i „To jest aplikacja z pełnym zaufaniem”

  4. Przejdź do właściwości -> Publikuj: Zalecam zmianę ścieżki folderu publikacji

Kingsley Akpan
źródło
0

Dokładnie ten sam problem miałem z moją aplikacją VS 2019.

Próbowałem stworzyć aplikację bez manifestu, ale to nie zadziałało.

Co jednak zadziałało, było następujące:

  1. Przejdź do Build -> Publish -> Application
  2. Kliknij przycisk „Informacje o montażu”
  3. Zaznacz opcję „Make Assembly-Visible”

Miejmy nadzieję, że to pomoże!

LaurentiuMa
źródło