Pytanie Kierowanie na platformę .NET Framework 4, gdy zainstalowany jest Framework 4.5


Mam zainstalowane VS2010 i VS2012 na moim komputerze i miałem .NET Framework 4.0, który następnie uaktualniłem do .NET Framework 4.5. Nadal jednak rozwijam aplikacje, które muszą pracować na platformie .NET Framework 4.0. Projekt mówi, że jest ukierunkowany na .NET Framework 4 (profil klienta), a złoenia wskazują nawet na folder .NET Framework 4.0 w zestawach referencyjnych. Problem pojawia się, gdy przestawiam tę aplikację na maszynę, która ma tylko 4.0, nie uruchomi się i pojawi się błąd, którego bezpośrednim problemem jest wyjątek WindowState={Binding WindowState} czego nie możesz zrobić w 4.0, ale możesz w 4.5. Potrzebuję tego, aby rzucić wyjątek na moim polu rozwojowym, dlaczego tak nie jest? Zakładam, że pomimo moich najlepszych wysiłków jest to, że używa 4.5 bibliotek dll, jeśli istnieją. Jak mogę naprawdę wykorzystać 4.0 bez deinstalacji 4.5?

Aktualizacja

Aby reproinstalować ten program .NET Framework 4.5 i utworzyć projekt WPF kierujący na system .NET Framework 4.0. Powiąż WindowState z właściwością w maszynie wirtualnej lub z kodem, aby ta właściwość miała publiczny i prywatny zestaw. Platforma .NET Framework 4.5 radzi sobie z tym dobrze, nawet gdy Mode = TwoWay musi zignorować zestaw .NET Framework 4 nie zgłasza wyjątku: "Wiązanie TwoWay lub OneWayToSource nie może działać na właściwości" tylko do odczytu "typu" tylko do odczytu ". . ". Na pudełku z .NET Framework 4.5 działa jak urok wypróbuj go na komputerze z tylko .NET Framework 4.0 i wieje ... Więc wszelkie pomysły, jak naprawdę cel 4.0, gdy jest zainstalowany 4.5?

Raport o błędzie do MS tutaj: https://connect.microsoft.com/VisualStudio/feedback/details/774694/targeting-net-framework-4-0-when-4-5-doesnt-seem-to-work


12
2017-12-18 21:55


pochodzenie


Jeśli kierujesz się na .NET 4.0, to dlaczego masz kod, który używa czegoś, co działa tylko w .NET 4.5? - John Saunders
Zakładając, że jest to poprawne (wątpię w to), nie rzuca wyjątku na twoje pole dev, ponieważ nie masz już zainstalowanego .NET 4.0. .NET 4.5 go zastąpił. - Hans Passant
@John: Nie wiedział, że działa tylko w 4.5. Chce, aby wystąpił wyjątek, nawet jeśli użytkownik ma zainstalowany program .NET 4.5. - Cameron
Tak więc w Project Properties-> Application-> Target Framework znajduje się profil klienta .Net Framework 4? - Melanie
@HansPassant To jest punkt .NET 4.5 zastępuje .NET 4.0, ale chcę się rozwijać dla .NET 4.0, więc jak mam to zrobić bez odinstalowywania 4.5, ponieważ mam aplikacje, które chcę skierować na 4.5? - user1914199


Odpowiedzi:


Czas rzucić to pytanie. Nie jestem ekspertem od WPF, nie podoba mi się to za dokładnie taki rodzaj problemów, debugowanie problemów związanych z właściwością zależności jest koszmarem. Ale jestem całkiem przekonany, że ścigasz ducha. WindowState był własnością zależną od wersji 3.0, nic specjalnego się nie stało w wersji 4.5, którą widziałem lub kiedykolwiek słyszałem.

Dostałeś jakiś komunikat o błędzie, którego nikt nie widział, przekonał cię, że ma to coś wspólnego z wiążącym. Jestem z Missouri, z Show Me State. Cóż, wystarczająco blisko do Wisconsin.

Poświęć więcej czasu pracując nad kodem, który zapewnia wiarygodny komunikat wyjątku i ślad stosu, który pomaga diagnozować błędy na maszynie, na której jesteś zainstalowany, ten bez debuggera, aby pomóc ci dowiedzieć się, co jest nie tak. Można to zrobić, pisząc moduł obsługi zdarzeń dla zdarzenia AppDomain.CurrentDomain.UnhandledException. Zaloguj się lub wyświetl wartość zwracaną e.ExceptionObject.ToString (). Podaje komunikat o wyjątku i Holy Stack Trace. Jeśli to nie pomoże, zaktualizuj swoje pytanie tym, co zobaczyłeś.


3
2017-12-18 22:38



Nie mogę tego przekonwertować w przykładowym projekcie, więc zgadywanie, że narzeka na stan okna, jest wynikiem czegoś innego, ale na dev dev działa dobrze. Zgłasza wyjątek w polu testowym, ale jeśli zainstaluję .NET Framework 4.5 w polu testowym, działa dobrze. Wyjątkowo różne zachowanie między platformami .NET Framework 4.0 i .NET Framework 4.5. - user1914199
Wyraźnie mówiłem o postawie "Show Me State". Wyjaśniłem, co musisz zrobić, aby to pokazać. Nadal nic nie widzę. Pokaż mi. - Hans Passant
Jest to właściwie błąd, który udało się nam powielić w naszym zespole programistycznym. więc zdecydowanie istnieje. - MaYaN


Wygląda na to, że jest to błąd w .NET Framework 4.5 i powinien wyrzucać wyjątek, ale z zainstalowanym .NET Framework 4.5 nie ma możliwości uruchomienia aplikacji na platformie .NET 4.0, zawsze będzie korzystać z wersji 4.5.

Zobacz ten zgłoszony błąd, aby uzyskać więcej informacji: http://connect.microsoft.com/VisualStudio/feedback/details/773682/wpf-property-with-prywatny-setter-jest-aktualizowane-z-przypadku-binding


3
2017-12-20 19:23





Powiedziałeś, że nie możesz tego odtworzyć w projekcie testowym. Oznacza to, że może to być coś takiego powinien działa dobrze w 4.0, prawda? Możesz mieć jakąś kombinację kodu, która zawiesza się na błędzie w wersji 4.0, który został naprawiony w wersji 4.5. Kiedy celujesz w 4.0, otrzymasz ostrzeżenia tylko wtedy, gdy spróbujesz użyć API / funkcji, które kompilator może określić, nie są obsługiwane w wersji 4.0.

Coś, co powinno działać w wersji 4.0, może się zawiesić z powodu rzadko zauważanego błędu, a następnie naprawić w wersji 4.5. Kiedy Twoja docelowa aplikacja 4.0 działa w środowisku 4.5, będzie miała wpływ na poprawki błędów do funkcji, które istniały w wersji 4.0.

Może istnieć aktualizacja dla wersji 4.0, która zawiera naprawę błędu, aby nie wymagać aktualizacji 4.5, jeśli użytkownicy z tego powodu będą z tego powodu mieć do czynienia. Może to nie być nawet zmiana 4.5, ale po prostu zbieg okoliczności, że niektórzy użytkownicy nie mają wszystkich dostępnych aktualizacji dla wersji 4.0 (które zostałyby zawarte łącznie w 4.5).

Tego typu przypadki rzadko się zdarzały, ale zdarzały się niekiedy i są powodem, dla którego osoby korzystające z aplikacji .NET na komputery stacjonarne są znane z proszenia użytkowników o aktualizację środowiska .NET w ramach pierwszej próby rozwiązania dziwnych problemów, zanim zaczną rozwiązywać problemy.

Czasem dzieje się odwrotnie. Twój kod działa tylko z powodu jakiegoś błędu lub złego zachowania API .NET, a później aktualizacja to czyści, być może zaostrzenie bezpieczeństwa gdzieś jest najczęstszą rzeczą, jaką widziałem, a twój kod nagle się zepsuł z powodu drobnej aktualizacji wersji .NET.


0
2017-12-19 00:31



Zobacz aktualizację na pytanie, udało mi się ją odtworzyć w projekcie testowym i nie ma ostrzeżenia, że ​​nie będzie działać dla .NET 4.0 (ale dobre myślenie). Wiązanie z własnością tylko do odczytu wydaje się dość znaczące, można by pomyśleć, że złapią to. Możesz uzyskać projekt testowy, podążając za linkiem do błędu MS i zawijając załącznik. - user1914199
Byłoby bardzo dobrze, gdyby projekt Run / Debug z Visual Studio używał jakiejś migawki środowiska wykonawczego .NET dla tej docelowej wersji. Kierowanie nie jest jednak zamierzone. Niektóre rzeczy po prostu nie mogą zostać przechwycone przez kompilator. Podczas kierowania na określoną strukturę, może ona przechwytywać tylko takie rzeczy, jak używanie interfejsu API, typ, przeciążenie określonej funkcji itp., Które nie istniało w tej wersji. Kompilator nie może uruchomić kodu i sprawdzić, czy przechodzi on przez ścieżkę, która spowodowałaby wyjątek. W podobny sposób transformacje konfiguracji nie mają żadnego wpływu podczas uruchamiania / debugowania, co utrudnia ich testowanie :( - AaronLS


.Net 4.5 zastępuje .net 4.0 nowymi bibliotekami o tej samej nazwie, które faktycznie mają pewne poprawki. To krótka odpowiedź.

W przeciwieństwie do wcześniejszych wersji, aktualizacja .net 4 do 4.5 zastępuje pliki, zamiast dodawać pliki dwustronne. Nawet jeśli masz folder podobny do tego Windows / Microsoft.Net / Framework / v40 /, Po aktualizacji nastąpiła zmiana w tym folderze. Pliki są zmieniane, niektóre błędy były obsługiwane w .net bez obaw deweloperów.

Jak wybrać system docelowy 4.0 za pomocą .net 4.5? Wciąż nie wiem, ale wciąż kopie

Sugerowana lektura na ten temat:

Scott Hanselman: http://www.hanselman.com/blog/NETVersioningAndMultiTargetingNET45IsAnInplaceUpgradeToNET40.aspx

Rick Strahl: http://weblog.west-wind.com/posts/2012/Mar/13/NET-45-is-an-inplace-replacement-for-NET-40

I podobny problem, stworzony przeze mnie: https://stackoverflow.com/questions/26483168/errors-on-net-4-0-dont-appear-on-net-4-5


0
2017-10-21 13:07





Rozwiązanie:

Mam taki sam problem po zainstalowaniu VS2017 po VS2015: Framework 4.0 właśnie zniknął z listy celów projektu.

Po kilku komentarzach tutaj próbowałem z pakietem NuGet: Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.4 i poprawka bin dla 1.0.1.

Nie rób tego Zrób to! Mój czas budowy wzrósł o 300% w przypadku tego samego projektu. To była katastrofa.

Widzę, że 4.5 jest "zastępowaniem na miejscu" dla wersji 4.0. Nie wyjaśnia to jednak, dlaczego nie widzę obu opcji w moim docelowym frameworku.

Czytałem tę samą mantrę w internecie. To po prostu nie jest odpowiedź na problem. Framework 4.0 to koniecznością dla każdego oprogramowania związanego z maszynami przemysłowymi - ponieważ działa w systemie Windows XP, a .NET 4.5. jest bezużyteczny w moim scenariuszu i prawdopodobnie dla wielu innych rzeczy z prawdziwego zdarzenia.

Rozwiązanie jest proste: Musisz tylko pobrać i zainstaluj Visual Studio 2013 Express z oficjalnej strony internetowej: https://www.microsoft.com/en-us/download/details.aspx?id=44914

Po zainstalowaniu wystarczy otworzyć VS2015 i zobaczysz 4.0 jeszcze raz.

enter image description here

... "W miejsce wymiany ..." moje ....


To jest ponowne przesłanie odpowiedzi, którą dałem pod duplikatem pytania. Zamieszczam tutaj, ponieważ wątek ten zwrócił na siebie więcej uwagi, a istniejące odpowiedzi nie dają rozwiązania tego problemu.


0
2018-05-09 18:45