A atualização do manifesto de implantação de um aplicativo ClickOnce programaticamente resulta no elemento <compatibleFrameworks> ausente, exigido em 4.0

Eu estou trabalhando na automação do instalador para um aplicativo .NET 4.0 ClickOnce WPF, que precisa de alguns itens a serem definidos noapp.config Arquivo. Eu passei pelo processo espinhoso de encontrar etapas específicas que devo seguir usandoMage.exe (isto é, atualizar e assinar novamente os manifestos de aplicativo e implantação) e agora estou tentando automatizá-lo para a instalação.

Optei por usar.deploy extensão para minimizar os problemas comIIS/ Mecanismos de segurança do Internet Explorer, então, essencialmente, o algoritmo é o seguinte (com base emAssinatura e nova assinatura de manifestos no ClickOnce (Saurabh Bhatia) eAtualizar configuração de um aplicativo ClickOnce WPF usando Mage ou MageUI, como fontes primárias entre outras):

Vou ao\Application Files\App_%HighestVersion%\ pastaRemover.deploy extensão para arquivos que o possuemCorremage -u %app%.exe.manifest -cf cert.pfxRestaurar.deploy extensãoCorremage -u %app%.application -appm %app%.exe.manifest -cf cert.pfxcópia de%app%.application 2 níveis acima (para..\.. - raiz de implantação)

Isso funciona perfeitamente se feito manualmente. Eu posso correr um.cmd arquivo, personalizado para os detalhes do ambiente (caminhos, etc.), mas eu precisaria incluirmage.exe na implantação, e se a Microsoft nos permite fazer isso é uma questão em aberto para mim. Assim, estou tentando realizar ações semelhantes noInstaller classe:

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);

Agora, aqui está o kicker. Tudo funciona perfeitamente com exceção da etapa 5. Quando o aplicativo é baixado para a máquina do usuário, há um problema com o manifesto de implantação:

O manifesto de implantação não é semanticamente válido.O manifesto de implementação está faltando <compatibleFrameworks>.

De fato, esta seção não está mais presente (no entanto, foi no% app% .application original!) Um resultado semelhante é descrito emClickOnce - .NET 4.0 erros: "manifesto de implantação não é semanticamente válido" e "manifesto de implantação está faltando <compatibleFrameworks>", mas é o resultado de um processo diferente (msbuild). Esta seção é nova (e obrigatória) para manifestos 4.0, então meu único palpite é que, de alguma forma, quando o ManifestWriter persiste mudanças no disco, ele faz isso de uma forma 3.5? Eu triplo verifiquei que uma biblioteca correta é usada (C: \ Arquivos de Programas (x86) \ Referência Assemblies \ Microsoft \ Framework.NETFramework \ v4.0 \ Microsoft.Build.Tasks.v4.0.dll).O que da?

Em vez de uma resposta até agora, tentei adicionar a seção ausente manualmente:

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);

Mas isso não tem efeito, não importa onde eu coloque este código, antesdm.ResolveFiles (), dm.UpdateFileInfo () ouManifestWriter.WriteManifest (..)!

Meu resultado é semelhante a perguntas sobre estouro de pilhaMageUI.exe remove o elemento compatibleFrameworks ouPor que o Mage.exe não gera um atributo compatibleFrameworks? ouMageUI.exe não está incluindo um elemento compatibleFrameworks, mas não estou usandomageui, mage ou até mesmomsbuild em absoluto!

O que está acontecendo?

questionAnswers(2)

yourAnswerToTheQuestion