이 답변을 게시하는 것을 주저합니다. 실제로 기술적으로 가능하지만 실제로는 잘 작동하지 않습니다. 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
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 호환성은 지적되지 않는 한 전설적입니다. 그 비용을 고객에게 전달하면 그들은 올바른 결정을 더 빨리 내리는 경향이 있습니다. :) 그러나 우리는 당신을 도울 수 없습니다.