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.pfx
Restaurar.deploy extensãoCorremage -u %app%.application -appm %app%.exe.manifest -cf cert.pfx
có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?