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

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

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

Go to the \Application Files\App_%HighestVersion%\ folder Remove .deploy extension for files that have it Run  mage -u %app%.exe.manifest -cf cert.pfx Restore .deploy extension Run  mage -u %app%.application -appm %app%.exe.manifest -cf cert.pfx Copy %app%.application 2 levels up (to ..\.. - deployment root)

Это отлично работает, если сделано вручную. Я могу запустить.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);

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

Deployment manifest is not semantically valid. Deployment manifest is missing <compatibleFrameworks>.

Действительно, этого раздела больше нет (however, it was in the original %app%.application!). Аналогичный результат описан вClickOnce - ошибки .NET 4.0: & quot; манифест развертывания не является семантически действительным & quot; и "Манифест развертывания отсутствует & lt; compatibilityFrameworks & gt;", но является результатом другого процесса (msbuild). Этот раздел является новым (и обязательным) для манифестов 4.0, поэтому я могу только предположить, что когда ManifestWriter сохраняет изменения на диске, он делает это в стиле 3.5? Я трижды проверил, что используется правильная библиотека (C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ Microsoft.Build.Tasks.v4.0.dll).What gives?

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

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 не генерирует атрибут compatibilityFrameworks? или жеMageUI.exe не включает совместимый элемент Frameworksно я не пользуюсьmageui, mage или дажеmsbuild совсем!

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

Ответы на вопрос(2)

Ваш ответ на вопрос