Aktualizowanie manifestu wdrażania dla aplikacji ClickOnce programowo powoduje brak elementu <compatibleFrameworks> wymaganego w wersji 4.0

Pracuję nad automatyzacją instalatora dla aplikacji WPF .NET 4.0 ClickOnce, która wymaga ustawienia kilku elementów wapp.config plik. Przeszedłem przez trudny proces znajdowania konkretnych kroków, których muszę przestrzegaćMage.exe (czyli aktualizuj i ponownie podpisuj aplikacje i manifesty wdrażania) i teraz próbuję zautomatyzować je do instalacji.

Zdecydowałem się użyć.rozmieścić rozszerzenie, aby zminimalizować problemyIIS/ Mechanizmy zabezpieczeń Internet Explorer, więc zasadniczo algorytm jest następujący (na podstawiePodpisywanie i ponowne podpisywanie manifestów w ClickOnce (Saurabh Bhatia) iAktualizacja konfiguracji aplikacji WPF ClickOnce przy użyciu Mage lub MageUI, jako główne źródła między innymi:

Idź do\Application Files\App_%HighestVersion%\ teczkaUsunąć.rozmieścić rozszerzenie dla plików, które go mająBiegaćmage -u %app%.exe.manifest -cf cert.pfxPrzywracać.rozmieścić rozbudowaBiegaćmage -u %app%.application -appm %app%.exe.manifest -cf cert.pfxKopiuj%app%.application 2 poziomy wyżej (do..\.. - root wdrożenia

To działa doskonale, jeśli jest wykonywane ręcznie. Mogę uruchomić.cmd plik, dostosowany do specyfiki środowiska (ścieżki itp.), ale wtedy musiałbym to uwzględnićmage.exe we wdrożeniu i to, czy Microsoft pozwala nam to zrobić, jest dla mnie otwartym pytaniem. Dlatego staram się wykonywać podobne działania wInstaller klasa:

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

Oto kopacz. Wszystko działa doskonale z wyjątkiem kroku 5. Gdy aplikacja jest pobierana na komputer użytkownika, występuje problem z manifestem wdrażania:

Manifest wdrożenia nie jest poprawny semantycznie.Brak manifestu wdrożenia <compatibleFrameworks>.

Rzeczywiście, ta sekcja nie jest już obecna (jednak był w oryginalnej aplikacji% app% .application!). Podobny wynik opisano wClickOnce - błędy .NET 4.0: „Manifest wdrażania nie jest semantycznie ważny” i „Brak manifestu wdrożenia <compatibleFrameworks>”, ale jest wynikiem innego procesu (msbuild). Ta sekcja jest nowa (i wymagana) dla manifestów 4.0, więc tylko zgaduję, że kiedy ManifestWriter utrzymuje zmiany na dysku, robi to w stylu 3.5? Potroiłem się, sprawdzając, czy używana jest prawidłowa biblioteka (C: Program Files (x86) Zestawy referencyjne Microsoft Framework.NETFramework 4.0.0 Microsoft.Build.Tasks.v4.0.dll).Co daje?

Zamiast dotychczasowej odpowiedzi próbowałem ręcznie dodać brakującą sekcję:

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

Ale to nie ma żadnego skutku, bez względu na to, gdzie wcześniej umieściłem ten koddm.ResolveFiles (), dm.UpdateFileInfo () lubManifestWriter.WriteManifest (..)!

Mój wynik jest podobny do pytań dotyczących przepełnienia stosuMageUI.exe usuwa element zgodnyFrameworks lubDlaczego Mage.exe nie generuje zgodnego atrybutu Framework? lubMageUI.exe nie zawiera elementu kompatybilnegoFrameworks, ale nie używammageui, mage lub nawetmsbuild w ogóle!

Co się dzieje?

questionAnswers(2)

yourAnswerToTheQuestion