Помилка розгортання програми ClickOnce - Посилання в маніфесті не відповідає ідентичності завантаженої збірки


105

Я намагаюся розгорнути додаток ClickOnce, але установка не працює на клієнті. Ось журнал помилок:

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.

Основна програма, яку мені потрібно розгорнути MyProductFrontDesk.exe, - це залежність від MyProductSiteServer.exe- і, здається, саме там, де викидається помилка: "Посилання в маніфесті не відповідає ідентичності завантаженої збірки MyProductSiteServer.exe."

Який маніфест потрібно виправити? І як?


Чи проект MySiteServer.exe в тому ж рішенні Visual Studio, що і MyProductFrontDesk.exe? Якщо так, чи обираються обидві збірки для побудови?
Джей

@Jay - так, в одному і тому ж рішенні обидва обрані для створення.
Шауль Бехр

Відповіді:


111

З проблемою Visual Studio 2008 виникла проблема, яка вирішується тим, що не вставляти маніфест за замовчуванням - один із коментарів до цієї статті передбачає, що проблема все ще існує у Visual Studio 2010.

У властивостях проекту -> вкладка програми -> ресурси -> прапорець Піктограма та маніфест , налаштування "Вставити маніфест із налаштуваннями за замовчуванням" викликало проблему. Якщо встановити його на "Створити додаток без маніфесту", виправляється проблема.


Я знайшов коментар 488301 особливо корисним: <assemblyIdentity/>елемент у користувальницькому маніфесті можна відрегулювати (або пропустити, щоб компілятор видав правильну ідентифікацію збірки) у вашому користувальницькому .manifestфайлі, що дозволить вказати такі речі, як <requestedExecutionLevel/>без порушення ClickOnce.
бінкі

4
У моєму сценарії було додаток GUI, якому потрібен другий додаток, який є консольним додатком. Якщо ви, як я, ви бажаєте не змінювати налаштування за замовчуванням, опублікувавши вручну, що 2-е додаток створило app.manifest, який з'явився в папці "Властивості", а потім знову опублікувати 1-шу додаток, працюючи без необхідності змінювати параметри вбудовування маніфесту за замовчуванням.
айбе

7
Була така ж проблема з VS 2013. Це рішення спрацювало.
EagleBeak

2
@EagleBeak, де це меню у VS2013? Я нічого не бачу про "створення програми без маніфесту"
Nefariis

3
Станом на червень 2016 року правильною відповіддю є налаштування параметрів безпеки ClickOnce (див. Відповідь, опубліковану Mauro).
П’єр Арно

57

У мене виникло те саме питання, коли я додав посилання на інший проект.

Шляхом вирішення цього питання було ввімкнення налаштувань безпеки ClickOnce у всіх посиланих проектах, як пояснив Іан тут (моє наголос):

Для мене, як це було вирішено було забезпечити , щоб всі проекти в рамках рішення , які викривали « Tab безпеки » в своїх « Властивості проекту » була включена опція « Enable Параметри безпеки ClickOnce » галочкою з опцією " Це повна довіра додаток "Вибрано. Це пов'язано з правильним створенням Manifest, і додаток не буде встановлюватися, якщо ці параметри не встановлені для всіх проектів у рішенні, які цього вимагають.

Я вважаю, що це правильний спосіб виправити це, посилаючись на інший проект за тим же рішенням.

Пов’язана публікація форуму минула, але вона доступна в архіві тут .


1
Після спроби такої кількості рішень для мене працює тільки це рішення. Тож я також думаю, що це має бути прийнятою відповіддю ...
Tareq

Можна зробити те ж саме, змінивши .cprojфайл за допомогою<PropertyGroup><TargetZone>LocalIntranet</TargetZone></PropertyGroup>
VMAtm

Я відключив ці два налаштування, поки я дурив https://github.com/Squirrel. Коли мої (невиробничі) ClickOnce перестали працювати, я забув про все це.
Вальтер Стабош

35

Я зіткнувся з тією ж проблемою, але моє рішення було зовсім іншим.

Мій додаток ClickOnce в моєму рішенні посилався на інший проект файлу EXE, тому коли клієнт завантажив його та з’явився ще один файл EXE, у нього не було маніфесту.

Видалення залежності від іншого виконуваного файлу вирішило мою проблему.


2
У мене також є два EXE. Видалення залежності виключає відновлюваний EXE зі збірки. Чи є спосіб включити його?
Урі Абрамсон

10
Це було рішенням для мене. Одним із проектів, на який головний EXE посилався, був сам "Додаток Windows". Коли я змінив цей проект на «Бібліотека класів» і перевидав, все працювало.
Кріс Рей

Я використовував пропозицію @ChrisRay у VS2012, і програма встановлювалась без особливих труднощів. Дякую!
Ролан

1
як згадує користувач @Aybe в коментарях іншої відповіді, якщо ви манекен опублікуєте другу програму, вона отримає свій власний маніфест і тоді ви можете опублікувати першу заявку, і обидві програми працюватимуть разом. (У моєму випадку у мене дві програми, одна з яких називає іншу.)
Дейв Кузен

Для мене рішення було і те і інше (це і @stuartd) - у мене є EXE як еталонна збірка, яка не має маніфесту. Але я не можу "видалити" це посилання, тому що мені потрібно його використовувати. Тому мені довелося перейти до проекту цієї залежності від EXE, застосувати пропозицію stuartd. Тоді все чудово працює.
KFL

11

Я підтвердив, що проблема існує також у Visual Studio 2010. Вибір "Створити додаток без маніфесту" у Властивості проекту - Додаток - Ресурси вирішили проблему.


8
Просто зауважте, що мені довелося змінити цю властивість у проекті, на який скаржилося повідомлення про помилку, що для мене було проектом, на який посилався проект, який я насправді намагався опублікувати, а не проектом, який я насправді намагався опублікувати .
смертельної собаки

6

Це також може статися, якщо у вашому проекті є дві різні версії пакету NuGet, на які посилається в різних файлах DLL. У моєму випадку я використовував фреймворк під назвою Catel, і я мав нову версію, на яку посилався в одному файлі DLL, ніж іншу (недогляд), але це спричинило ClickOnce виплюнути цю помилку. Посилання на ту саму версію вирішило проблему.


4

У мене була така ж проблема, але моє рішення було змінити «Ціль платформи» на «x86» (Властивості проекту -> Вкладка збірки). Він був встановлений на будь-який процесор. Щойно я змінив налаштування і перепублікував, установку ClickOnce вдалося завершити.


1
Дуже схоже питання: у мене було включено "Віддати перевагу 32-розрядному"; його вимкнення виправили проблему.
Роман Старков

4

Я зазнав таку ж помилку під час розгортання з проектом, встановленим на налагодження. Коли її було повернено на Release, помилки не було.


4

У мене було саме таке питання. Я не зміг зняти залежність, оскільки це було потрібно основним проектом. Другий проект був консольним проектом.

Я перейшов на Класну бібліотеку , і тоді все спрацювало.


Цей коментар вирішив мою проблему. Дякую!
casaout

2

Ще одне вирішення, якщо exe залежності від маніфесту поганої програми не може бути змінено (скажімо, що надходить з пакету NuGet). Бінарний файл може бути включений у вигляді вмісту з розширеним фіксом, тому ClickOnce не намагається перевірити маніфест, а потім перейменовано під час запуску програми.

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

У мене було те саме питання, і я спробував усі попередні запропоновані рішення тут, і всі вони не спрацювали.

Я виправив це, змінивши місце оновлення. З властивостей проекту -> Опублікувати -> Оновлення . Змініть місце оновлення до опублікованої папки.


1

ТАКОЖ вирішений для виклику ClickOnce .exe .exe call .exe.

У мене була ця проблема також, використовуючи VB.NET у Visual Studio 2010.

У мене є програма ClickOnce Windows Forms, яка посилається на другу програму Windows Forms, яка, в свою чергу, посилається на третю програму Windows Forms. (Ці другий та третій програми є EXE файли а не файл DLL для простоти, оскільки вони однаковою мірою можуть працювати окремо або викликатись із властивостями, переданими їм.)

Мені довелося коментувати ВІДМОВИЙ вміст маніфестів другої та третьої заявок на:

Покрокові інструкції: вручну розгортання програми ClickOnce

Це прекрасно працює.


1

Якщо у вас є одна основна програма, яка посилається на іншу, вам слід виконати трюк "Створити додаток без маніфесту" у програмі основної програми:

Проект -> Властивості -> Вкладка програми -> Ресурси -> Маніфест -> випадаюче меню "Створити додаток без маніфесту"

а потім перейдіть до властивостей проекту згаданої програми та повторіть процес.


0

Я використовую Visual Studio 2012 в Windows 7 і мені потрібно опублікувати рішення, що складається з двох проектів.

Як зауважив Едуардо, позначення обох проектів як ClickOnce, а також включення програми Full Trust вирішує проблему.


0

У мене була трохи інша проблема, яку я зміг вирішити, і тому я хотів опублікувати. Мої проблеми полягали в тому, що я працював із відділеннями TFS 3 відділення. Я вдосконалив управління Telerik в одній з моїх гілок, але не в інших. Одного разу я оновив елементи керування Telerik у всіх трьох відділеннях і перепублікував його, і ця помилка усунулася.

У той час я працював на VS2015.


0

Це цікаво. Я просто перерозподілив програму і вирішив проблему. Можливо, файл пошкоджений через мережу.


0

Я використовую mage.exeдля створення свого маніфесту. Додавши це до моєї .csprojвиправленої проблеми. Ви також можете спробувати -nowin32manifest прапор компілятора ; Я його не перевіряв. Я не бачу "Створити додаток без маніфесту" Stuartd у Visual Studio 2017; Я думаю, що саме це і робить.

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

У мене це також є .csproj:

<GenerateManifests>false</GenerateManifests>

0

У моїй версії Visual Studio 2017 версії 15.6.6 (але це можливо було раніше) я виявив, що файли додатків не в Exe Project та Publish правою кнопкою миші, а на вкладці Опублікувати властивості проекту, де можна встановити, який файлів додатків, які потрібно помістити в інсталяцію.

Тож вийміть ті, які є проблемою. Якщо на комп’ютері, де буде встановлено цей додаток, щось вже встановлено, немає ніяких причин намагатися його знову встановити, за винятком випадків, коли для запуску потрібна посилання. Якби встановити те, що вже було на ПК, але в іншу папку це може не працювати. Найкраще використовувати інші програми або збірки dll в тому ж місці, де вони були встановлені раніше.


0

У мене була така ж проблема пару хвилин тому, а нижче - кроки, якими я користувався для її вирішення.

Ключ

  • a = Основний проект (проект, який ви хочете опублікувати, наприклад, мій продукт)
  • b = Довідковий проект (наприклад, MyProductSiteServer)

Контрольний список

  1. Перейдіть до властивостей -> Додаток -> Ресурси -> Перевірте піктограми та маніфест (для a і b)

  2. Перейдіть до властивостей -> Build: переконайтеся, що a і b знаходяться на одній цільовій платформі

  3. Перейдіть до властивостей -> Безпека та переконайтесь, що для a і b встановлені ці налаштування: "Увімкнути налаштування безпеки ClickOnce" та "Це повна програма довіри"

  4. Перейдіть до властивостей -> Опублікувати: рекомендую змінити шлях папки публікації


0

У мене була така сама проблема із моєю заявкою на VS 2019.

Я спробував створити додаток без маніфесту, однак це не спрацювало.

Що, однак, працювало наступне:

  1. Перейдіть до збірки -> опублікувати -> додаток
  2. Натисніть кнопку "Інформація про збірку"
  3. Поставте прапорець "Зробити збірку COM-Visible"

Сподіваємось, це допомагає!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.