XP에서 .NET 4.5 앱을 실행할 수 있습니까?


86

먼저 다음을 읽었습니다.

그래서 마지막 글 머리 기호에서 저는이 문제를 해결할 방법이 없다고 생각합니다.하지만 저희 팀이 .NET 4.0에서 .NET 4.5로 업그레이드하기를 원하기 때문에 확실한 답을 얻을 수 있는지 확인해야했습니다. 하지만 XP를 지원해야합니다.

XP를 지원하려는 경우 .NET 4.5로 이동할 가능성이 없습니까?

내가 생각할 수있는 유일한 것은 두 개의 별도 솔루션을 만드는 것입니다.하지만 .NET 4.5 기능을 사용하면 코드베이스가 달라져야합니다.

그래서 저는 찾을 수 없었고 다른 사람들이 이미 알고있을 수도있는 몇 가지 놀라운 해결 방법을 찾고 있습니다.


9
아니, 할 수 없습니다. XP가 확실히 죽을 때까지 4.0을 고수하십시오.
페데리코 Berasategui

답변:


188

이 답변을 게시하는 것을 주저합니다. 실제로 기술적으로 가능하지만 실제로는 잘 작동하지 않습니다. CLR 및 핵심 프레임 워크 어셈블리의 버전 번호는 4.5에서 변경되지 않았습니다. 여전히 CLR의 v4.0.30319를 대상으로하고 프레임 워크 어셈블리 버전 번호는 여전히 4.0.0.0입니다. ildasm.exe와 같은 디스어셈블러를 사용하여 어셈블리 매니페스트를 볼 때 유일한 점은 4.5가 필요하며 변경해야한다는 [TargetFramework] 특성이 있다는 것입니다. 실제로 그렇게 쉽지는 않지만 컴파일러에서 내 보냅니다.

가장 큰 차이점은 눈에 띄지 않는다는 것입니다. 마이크로 소프트는 어셈블리의 실행 가능한 헤더를 오랫동안 변경했습니다. 실행 파일이 호환되는 Windows 버전을 지정합니다. XP는 Windows 2000으로 시작된 이전 세대의 Windows에 속합니다. 주 버전 번호는 5입니다. Vista는 현재 세대의 시작 인 주 버전 번호 6입니다.

.NET 컴파일러는 항상 최소 버전 번호를 Windows NT 및 Windows 9x 버전 인 4.00으로 지정했습니다. 어셈블리에서 dumpbin.exe / headers를 실행하여이를 확인할 수 있습니다. 샘플 출력은 다음과 같습니다.

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            ...
            4.00 operating system version
            0.00 image version
            4.00 subsystem version              // <=== here!!
               0 Win32 version
            ...

.NET 4.5의 새로운 기능은 컴파일러가 해당 하위 시스템 버전을 6.00으로 변경한다는 것입니다. Windows가 그 숫자가 충분히 작은 지 확인하는 것 이상으로 그 숫자에주의를 기울이기 때문에 대부분 기한이 지난 변경입니다. 또한 프로그램이 이전 버전의 Windows에서 작동하도록 작성되었다고 가정하므로 appcompat 기능을 켭니다. 이러한 기능은 특히 Windows가 Aero에서 창 크기에 대해 놓이는 방식에 문제를 일으 킵니다. 프로그램이 Aero가있는 Windows 버전에서 실행되도록 설계되었음을 알 수있을 때 Aero 창의 두꺼운 테두리에 대해 거짓말을 중지합니다.

/ subsystem 옵션을 사용하여 어셈블리에서 Editbin.exe를 실행하여 해당 버전 번호를 변경하고 다시 4.00으로 설정할 수 있습니다. 이 답변 은 샘플 빌드 후 이벤트를 보여줍니다.

그러나 그것은 좋은 소식이 끝나는 부분에 관한 것입니다. 중요한 문제는 .NET 4.5가 .NET 4.0과 매우 호환되지 않는다는 것입니다. 지금까지 가장 큰 문제는 클래스가 한 어셈블리에서 다른 어셈블리로 이동되었다는 것입니다. 특히 [Extension] 속성에서 발생했습니다. 이전에는 System.Core.dll에서 .NET 4.5의 Mscorlib.dll로 이동했습니다. 자체 확장 메서드를 선언하는 경우 XP에서는 카붐입니다. 프로그램은 System.Core 참조 어셈블리의 .NET 4.5 버전에서 [TypeForwardedTo] 속성으로 활성화 된 속성을 Mscorlib에서 찾아 보라고 말합니다. 그러나 .NET 4.0에서 프로그램을 실행할 때는 없습니다.

물론 .NET 4.5에서만 사용할 수있는 클래스와 메서드 사용을 중단하는 데 도움이되는 것은 없습니다. 그렇게하면 4.0에서 실행될 때 TypeLoadException 또는 MissingMethodException과 함께 프로그램이 실패합니다.

4.0 만 목표로하면 이러한 모든 문제가 사라집니다. 또는 프로그래머가 자주 내릴 수 없지만 그것이 야기하는 번거 로움을 지적함으로써 확실히 장려 할 수있는 비즈니스 결정 인 XP 지원을 중단하고 XP 지원을 중단하십시오. 물론 오래된 운영 체제를 지원하는 데 드는 비용은 0이 아니며 테스트 노력만으로도 상당합니다. 경영진이 자주 인식하지 못하는 비용 인 Windows 호환성은 지적되지 않는 한 전설적입니다. 그 비용을 고객에게 전달하면 그들은 올바른 결정을 더 빨리 내리는 경향이 있습니다. :) 그러나 우리는 당신을 도울 수 없습니다.


2
Hans에게 감사합니다. 몇 가지 주요 변경 사항이 있다고 생각했습니다. 해결 방법도 감사합니다. 귀하가 지정한 이유 때문에 함께 갈 수는 없지만 알아두면 좋습니다. 아마 XP는 .... 좋은 언젠가 멀리 갈 것
저스틴 Pihony

3
just the testing effort is substantial-그것이 "XP 지원 중단을 허용"하는 우리의 관리를받은 것입니다.
Christoph Fink

나는 이것이 오래된 게시물이라는 것을 알고 있지만-@JustinPihony : 회사에서 최신 OS를 설치 한 다음 VMWare 또는 Virtual Box를 설치할 생각을 해본 적이 있습니까? Windows 7의 경우 약간 늦었지만 Microsoft는 7과 XP 사이를 전환 할 수있는 가상 Windows XP 설치를 제공했습니다. 그냥 생각. :-)
Mark Manning

@MarkManning 그것은 우리의 통제에 없었습니다. 다른 곳에서 사용되고있었습니다.
저스틴 Pihony

1
@JustinPihony : 아. Hmmmmm ...... 내 유일한 다른 제안은 kluge입니다. OS 버전을 캡처 한 다음 클래스의 모든 함수를 배열 (또는 배열)에 배치하기 만하면됩니다. 하나의 어레이 (또는 어레이의 일부)는 XP 용이고 다른 하나는 최신 OS 용입니다. 그런 다음 필요한 것은 사용할 세트를 나타내는 데 사용되는 일종의 전역 변수입니다. 호출은 모두 같거나 같을 수 있지만 한 세트는 NET40_ <FUNCTION>을 사용하고 다른 세트는 NET45_ <FUNCTION>을 사용할 수 있습니다. 이것은 함수 자체에 대한 간접 호출입니다. 말이 돼?
Mark Manning

21

안타깝게도 XP에서는 4.5 프로그램을 실행할 수 없습니다.

그리고 그 연결 페이지의 관련 게시물 :

Microsoft가 2012 년 3 월 23 일에 10:39
에 작성했습니다. 신고 해 주셔서 감사합니다. 이 동작은 .NET Framework 4.5 베타에서 의도적으로 설계된 것입니다. 지원되는 최소 운영 체제는 Windows 7, Windows Server 2008 SP2 및 Windows Server 2008 R2 SP1입니다. Windows XP는 베타 릴리스에서 지원되는 운영 체제가 아닙니다.


8

Mono 프로젝트는 Windows XP 지원을 중단 하고 언급하는 것을 "잊었습니다" . 그들은 여전히 ​​Windows XP SP2가 최소 지원 버전이라고 주장하지만 실제로는 Windows Vista입니다.

Windows XP를 지원하는 마지막 Mono 버전은 3.2.3이었습니다.


7

모노 시도 :

http://www.go-mono.com/mono-downloads/download.html

이 다운로드는 Windows XP, 2003, Vista 및 Windows 7의 모든 버전에서 작동합니다.


2
Mono는 .NET보다 느리고 .NET 4.5의 대부분의 기능을 가지고 있지만 WPF ( mono-project.com/Compatibility ) 와 같은 특정 주요 구성 요소가 없습니다 . 따라서 Mono가 필요한 모든 기능을 제공하고 성능에 미치는 영향에 만족한다면 XP 지원용 Mono를 사용할 수 있습니다. 플러스 측면에서 특별한 "Mono 빌드"를 만들 필요가 없어야합니다. 일반 .NET 4.5 빌드는 일반적으로 Mono에서 작동하지만 호환되는지 확인하려면 Mono에 대해 특별히 테스트해야합니다.
Qwertie 2014 년

2
Windows XP SP3에서 mono-3.12.1-gtksharp-2.12.26-win32-0.msi를 시도했지만 "mono.exe는 유효한 Win32 응용 프로그램이 아닙니다" 와 함께 실패했습니다 . 또한 mono-3.0.10-gtksharp-2.12.11-win32-0.exe를 시도했지만 "mono.exe-Entry Point Not Found. 프로 시저 진입 점 InterlockedCompareExchange64를 동적 링크 라이브러리 KERNEL32에서 찾을 수 없습니다. .dll " .
Cristian Ciupitu 2015

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.