Ошибка развертывания приложения 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 - да, в одном решении, оба выбраны для сборки.
Shaul Behr

Ответы:


111

Возникла проблема с Visual Studio 2008, которая решается отсутствием встраивания манифеста по умолчанию - один из комментариев к этой статье предполагает, что проблема все еще существует в Visual Studio 2010.

В свойствах проекта -> вкладка « Приложение » -> Ресурсы -> значок флажка и манифест , настройка «Вставить манифест с настройками по умолчанию» вызвала проблему. Установка для него значения «Создать приложение без манифеста» устраняет проблему.


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

4
Моим сценарием было приложение с графическим интерфейсом, которому требуется второе приложение, которое является консольным приложением. Если вы, как и я, предпочли бы не менять настройки по умолчанию, вручную опубликовав это второе приложение, создав приложение app.manifest, которое появилось в папке «Свойства», а затем снова опубликовав первое приложение, вам не пришлось менять настройки по умолчанию для встраивания манифеста.
Айбе

7
Была такая же проблема с VS 2013. Это решение сработало.
EagleBeak 08

2
@EagleBeak где это меню в VS2013? Я не вижу ничего о «создании приложения без манифеста»
Нефарис

3
По состоянию на июнь 2016 года правильный ответ - настроить параметры безопасности ClickOnce (см. Ответ, опубликованный Мауро).
Pierre Arnaud

58

У меня была такая же проблема, когда я добавил ссылку на другой проект.

Чтобы решить эту проблему, включите параметры безопасности ClickOnce во всех упомянутых проектах, как объяснил здесь Ян (выделено мной):

Для меня способ решения этой проблемы заключался в том, чтобы гарантировать, что все проекты в рамках решения, которые открывают вкладку « Безопасность » в своих « Свойствах проекта », имели параметр « Включить параметры безопасности ClickOnce », отмеченный флажком « Это полное доверие». приложение «Выбрано. Это связано с правильным созданием манифеста, и приложение не будет установлено, если эти параметры не установлены для всех проектов в рамках решения, которым это необходимо.

Я считаю, что это правильный способ исправить это при ссылке на другой проект с тем же решением.

Связанное сообщение на форуме истекло, но оно доступно в архиве здесь .


1
После того, как я попробовал так много решений, у меня работает только это решение. Так что я тоже думаю, что это должен быть принятый ответ ...
Тарек

Вы можете сделать то же самое с изменением .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 в комментариях к другому ответу, если вы фиктивно опубликуете второе приложение, оно получит свой собственный манифест, а затем вы сможете опубликовать первое приложение, и обе программы будут работать вместе. (В моем случае у меня есть две программы, одна из которых вызывает другую.)
Дэйв Кузино

Решение для меня было действительно обоими (this и @stuartd) - у меня есть EXE в качестве эталонной сборки, у которой нет манифеста. Но я не могу «удалить» эту ссылку, потому что мне нужно ее использовать. Поэтому мне пришлось перейти к проекту этой EXE-зависимости, применить предложение Стюарта. Тогда все отлично работает.
KFL

11

Я подтвердил, что проблема также существует в Visual Studio 2010. Выбор «Создать приложение без манифеста» в свойствах проекта - Приложение - Ресурсы решил проблему.


8
Просто обратите внимание, что мне пришлось изменить это свойство в проекте, на который жаловалось сообщение об ошибке, что для меня было проектом, на который ссылается проект, который я на самом деле пытался опубликовать, а не проект, который я на самом деле пытался опубликовать. .
deadlydog

6

Это также может произойти, если у вас есть две разные версии пакета NuGet , на которые есть ссылки в разных файлах DLL в вашем проекте. В моем случае я использовал фреймворк под названием Catel, и у меня была более новая версия, указанная в одном файле DLL, чем в другом (надзор), но это заставило ClickOnce выплюнуть эту ошибку. Ссылка на ту же версию решила проблему.


4

У меня была та же проблема, но я решил изменить «Целевую платформу» на «x86» (Свойства проекта -> Вкладка «Сборка»). Было установлено значение Any CPU. Как только я изменил настройку и опубликовал заново, установщик ClickOnce смог завершить работу.


1
Очень похожая проблема: у меня был включен параметр «Предпочитать 32-битный»; отключение решило проблему.
Роман Старков

4

У меня возникла такая же ошибка при развертывании с проектом, установленным на Debug. Когда он был изменен обратно на 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, вызывающего .exe.

У меня тоже была эта проблема, используя VB.NET в Visual Studio 2010.

У меня есть приложение Windows Forms ClickOnce, которое ссылается на второе приложение Windows Forms, которое, в свою очередь, ссылается на третье приложение Windows Forms. (Эти второе и третье приложения являются EXE- файлами, а не DLL-файлами для простоты, поскольку они с одинаковой вероятностью будут запускаться автономно или вызываться с переданными им свойствами.)

Мне пришлось закомментировать содержимое манифеста ОБОИХ и третьего приложений :

Пошаговое руководство: развертывание приложения ClickOnce вручную

Работает отлично.


1

Если у вас есть одна основная программа, которая ссылается на другую, вам нужно проделать трюк «Создать приложение без манифеста» на Program основной программы:

Проект -> Свойства -> вкладка «Приложение» -> Ресурсы -> Манифест -> раскрывающийся список «Создать приложение без манифеста»

а затем переключитесь на свойства проекта указанной программы и повторите процесс.


0

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

Как отметил Эдуардо, отметка обоих проектов как ClickOnce и включение приложения полного доверия решает проблему.


0

У меня была немного другая проблема, которую я смог решить, поэтому я хотел опубликовать ее. Мои проблемы заключались в том, что я запускал 3 ветки из TFS. Я обновил элементы управления Telerik в одном из своих филиалов, но не в других. Как только я обновил элементы управления Telerik во всех 3 ветках и повторно опубликовал его, он заработал, и эта ошибка исчезла.

В то время я работал с VS2015.


0

Это интересно. Я просто повторно развернул приложение и проблема решена. Возможно повреждение файла из-за сети.


0

Я использую mage.exeдля создания своего манифеста. Добавление этого к моему .csprojисправило проблему. Вы также можете попробовать -nowin32manifest флаг компилятора ; Я не тестировал. Я не вижу команды Стюарта «Создать приложение без манифеста» в Visual Studio 2017; Я думаю, что это то, что он делает.

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

У меня тоже есть это .csproj:

<GenerateManifests>false</GenerateManifests>

0

В моей версии Visual Studio 2017 версии 15.6.6 (но, возможно, она была там раньше), я обнаружил, что файлы приложения не были в проекте Exe и публикации правой кнопкой мыши, а на вкладке публикации свойств проекта, где вы можете указать, какие файлов приложения, которые вы хотите поместить в установку.

Так что избавьтесь от проблемных. Если что-то уже установлено на компьютере, на котором будет установлено это приложение, нет причин пытаться переустановить его в любом случае, кроме случаев, когда вам нужна ссылка для его запуска. Если бы он установил то, что уже было на компьютере, но в другую папку, это могло бы не сработать. Лучше всего использовать другие приложения или сборки dll в том же месте, где они были установлены ранее.


0

У меня была такая же проблема пару минут назад, и ниже приведены шаги, которые я использовал для ее решения.

Ключ

  • a = Основной проект (проект, который вы хотите опубликовать, например, myProduct)
  • b = эталонный проект (например, MyProductSiteServer)

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

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

  2. Перейдите к свойствам -> Сборка: убедитесь, что a и b находятся на одной целевой платформе

  3. Перейдите к свойствам -> Безопасность и убедитесь, что для пунктов a и b отмечены следующие параметры: «Включить параметры безопасности ClickOnce» и «Это приложение с полным доверием».

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


0

У меня была такая же проблема с моим приложением VS 2019.

Я попытался создать приложение без манифеста, но это не сработало.

Однако работало следующее:

  1. Перейдите в Build -> Publish -> Application
  2. Нажмите кнопку «Информация о сборке».
  3. Установите флажок «Сделать сборку видимой для COM».

Надеюсь, это поможет!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.