Обновление манифеста развертывания для приложения ClickOnce программным путем приводит к отсутствию элемента , необходимого в версии 4.0

Я работаю над автоматизацией установщика для приложения.NET 4.0 ClickOnce WPF, для которого необходимо установить несколько элементов в файле app.config . Я прошел через тернистый процесс поиска конкретных шагов, которые я должен выполнить, используя Mage.exe(то есть обновить и повторно -подписать приложения и манифесты развертывания ), и теперь я пытаюсь автоматизировать установку.

Я решил использовать расширение .deploy , чтобы свести к минимуму проблемы с механизмами безопасности IIS /Internet Explorer, поэтому алгоритм выглядит следующим образом (на основеМанифесты подписания и повторного -подписания в ClickOnce (Саурабх Бхатия)иОбновление конфигурации приложения WPF ClickOnce с помощью Mage или MageUI, как первоисточники среди прочих):

  1. Перейдите в папку \Application Files\App_%HighestVersion%\
  2. Удалите расширение .deploy для файлов, которые имеют его
  3. . Бегиmage -u %app%.exe.manifest -cf cert.pfx
  4. Восстановить .deploy расширение
  5. Бегиmage -u %app%.application -appm %app%.exe.manifest -cf cert.pfx
  6. Скопируйте %app%.applicationна 2 уровня вверх с (по ..\..-. корень развертывания)

Это прекрасно работает, если делать это вручную. Я могу запустить файл .cmd , настроенный для специфики среды (пути и т. д. ), но тогда мне нужно будет включить mage.exeв развертывание, и разрешит ли Microsoft нам делать это открытый вопрос для меня. Таким образом, я пытаюсь выполнить аналогичные действия в классе Installer:

X509Certificate2 ct = new X509Certificate2(sPathCert);

// .. Remove.deploy extension (for files in the sPathApp folder).

sPathMft = Directory.GetFiles(sPathApp, "*.exe.manifest")[0];
ApplicationManifest am = ManifestReader.ReadManifest( "ApplicationManifest", sPathMft, false ) as ApplicationManifest;
if (am == null)
    throw new ArgumentNullException("AppManifest");
am.ResolveFiles();
am.UpdateFileInfo( );
ManifestWriter.WriteManifest(am, sPathMft);
SecurityUtilities.SignFile(ct, null, sPathMft);

//   .. Restore.deploy extensions to files touched above.

sPathMft = Directory.GetFiles(sPathApp, "*.application")[0];
DeployManifest dm = ManifestReader.ReadManifest("DeployManifest", sPathMft, false) as DeployManifest;
if (dm == null)
    throw new ArgumentNullException( "DplManifest" );
dm.ResolveFiles();
dm.UpdateFileInfo();
ManifestWriter.WriteManifest(dm, sPathMft);
SecurityUtilities.SignFile(ct, null, sPathMft);

File.Copy(sPathMft, sPathBin + "\\" + dm.AssemblyIdentity.Name, true);

. А вот и кикер . Все работает отлично, за исключением шага 5.Когда приложение загружается на компьютер пользователя, возникает проблема с манифестом развертывания :

  • . Манифест развертывания семантически недействителен.
  • В манифесте развертывания отсутствует .

Действительно, этого раздела больше нет(однако это было в исходном %app%.application ! ). Подобный результат описан в . ClickOnce -Ошибки.NET 4.0 :«Манифест развертывания недействителен семантически» и «Отсутствует манифест развертывания », но является результатом другого процесса (msbuild ). Этот раздел является новым (и требуется )для манифестов 4.0, поэтому я могу предположить, что каким-то образом, когда ManifestWriter сохраняет изменения на диске, он делает это в стиле 3.5? Я трижды проверил, что используется правильная библиотека (C :\Program Files (x86 )\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Microsoft.Build.Tasks.v4.0. dll ). Что дает?

Вместо ответа до сих пор я пытался добавить отсутствующий раздел вручную:

dm.CompatibleFrameworks.Clear(); // Unnecessary as dm.CompatibleFrameworks.Count == 0 indeed!
CompatibleFramework cf = new CompatibleFramework();
cf.Version= "4.0";
cf.SupportedRuntime = "4.0.30319";
cf.Profile= "Client";
dm.CompatibleFrameworks.Add(cf);
cf = new CompatibleFramework();
cf.Version = "4.0";
cf.SupportedRuntime = "4.0.30319";
cf.Profile = "Full";
dm.CompatibleFrameworks.Add(cf);

Но это не имеет никакого эффекта, независимо от того, где я размещаю этот код, перед dm.ResolveFiles(), dm.UpdateFileInfo()или ManifestWriter.WriteManifest (...)!

Мой результат аналогичен вопросам о переполнении стекаMageUI.exe удаляет совместимый элемент FrameworksилиПочему Mage.exe не создает атрибут CompatibleFrameworks?илиMageUI.exe не включает совместимый элемент Frameworks, но я вообще не использую mageui, mageи даже msbuild!

Что происходит?

6
задан Community 23 May 2017 в 11:56
поделиться