2016-06-17 2 views
7

나는 상당한 연구를했으며 적절한 대답을 찾지 못했습니다. 다음은 시나리오입니다..NET Framework 4.6.1에서 실행되도록 .NET Framework 4를 대상으로 컴파일 된 응용 프로그램을 강제로 설치하는 방법은 무엇입니까?

.NET Framework 4를 대상으로 컴파일 된 응용 프로그램이 있습니다. 런타임에 .NET Framework 4.6.1 내에서 실제로 응용 프로그램을 실행하고 싶습니다. 지금까지 두 가지 옵션을 발견했습니다.

  1. 재 컴파일 = "4.0"SKU = ". NETFramework, 버전 = v4.6.1 버전의 app.config 할 수있는 구성/시작/supportedRuntime 요소를 추가합니다 .NET 프레임 워크 4.6.1
  2. 에서 응용 프로그램

옵션 1은 소프트웨어를 다시 릴리스해야하므로 바람직하지 않습니다.

옵션 2는 예상 한대로 작동하지 않습니다. CLR 4.0 (프레임 워크 4.0이 아님)이 설치되어 있는지 확인한 후 설치하지 않고 적절한 SKU를 다운로드하라는 메시지가 표시되면 확인합니다. 설치 후, 응용 프로그램이 여전히 테스트로 .NET 프레임 워크 4.0

에서 실행하고, 그 컴파일 할 경우이 질문에 게시 된 이유는 단순히이

Console.WriteLine(System.Net.ServicePointManager.SecurityProtocol); 

을하는 작은 콘솔 응용 프로그램을 만들어 .NET 프레임 워크 4는 다음 출력이 SSL3, TLS를

입니다에 대해 그 .NET Framewo에 대해 컴파일하는 경우 RK 4.6.1 다음 출력은 Tls12

TLS를 Tls11입니다

+2

http://stackoverflow.com/a/28502562/17034 –

+1

감사합니다. 한스. 이것은 내 샘플의 문제를 해결하고 우리가 사용하려고하는 것입니다. 나는 또한 더 큰 질문에 대한 대답에도 관심이있다. 가능하다면 우연히 알고 있습니까? 그렇다면 어떻게 될까요? –

+1

Hmya, SecurityProtocolType .NET 4.0 버전에는 원하는 enum 값이 없습니다. 앱이 속성 값을 올바르게 해석 할 수있는 방법은 매우 어렵습니다. 그러나 그것이 작동한다면 그것은 작동합니다. –

답변

8

내가 ... 4.6.1

글쎄, 당신은 이미 app.config 파일 항목과 한 프레임 워크를 사용하여 실행하는 프레임 워크 4.0에 대해 컴파일 된 응용 프로그램을 강제 일반적인 경우에 대해 질문하고있다.this feature을 사용하면 사용자는 먼저 4.6.1을 설치하지 않고 프로그램을 실행할 수 없습니다. 그가해야 할 일은 예 버튼을 클릭하는 것입니다. 이 작업이 자주 수행되는 것은 아니지만 사용자가 컴퓨터를 Windows Update로 업데이트 할 책임이있는 경우 4.6.1이 항상 컴퓨터에 있어야합니다. 그가 의도적으로하지 않으면 "강요"는 잘 받아 들여지지 않을 것입니다.

그러나 실제로 귀하의 질문에 관한 것은 아닙니다. 에 프로그램을 설치하려면 4.6.1에 설치된 것과 같이을 실행하십시오. 그것은 입니다. 다른 물고기 주전자입니다. 2) 작동하지 않았다는 것을주의하십시오. 런타임을 쉽게 속일 수는 없습니다. 컴파일러는 실행 파일에 TargetFrameworkAttribute attribute을 포함하고 은입니다. 런타임에서 사용법을 결정하는 데 사용합니다. ildasm.exe를보고 살펴보고 매니페스트를 두 번 클릭하여 확인하십시오. app.config 항목은이 항목을 무시하지 않습니다.

가장 큰 문제는 .NET 4.5가 근본적으로 달라서 과 크게 달라지며 런타임과 프레임 워크 어셈블리 모두에서 변경이 큰 것입니다. 버전을 5.0까지 끌어 올릴만큼 무거웠습니다. 그러나 그것은 항상 많은 고통과 고통을 고객에게 유발합니다. Microsoft는 4.0을 목표로하는 프로그램을 실행하면 4.5 (및 그 이상)가 4.0처럼 동작하도록 책에서 모든 트릭을 꺼냅니다.

트릭 하나가 아닙니다. 하나의 핵심 접근 방식은 c : \ Program Files (x86) \ Reference Assemblies 디렉토리에 저장된 참조 어셈블리입니다. 그들은 타겟팅 팩 파일을 저장합니다. 프로그램을 처음 만들 때 C : \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.0에 저장된 것을 사용했습니다. 프로젝트의 타겟을 변경하면 v4.6.1에 저장된 프로젝트를 사용하게됩니다. 그들은 매우 다릅니다. 그리고 특히 당신이 말하는 SecurityProtocolType enum이 다르다면 두 개의 새로운 값을 얻습니다. 이 변경 변경입니다. .NET 4.0 프로그램은 SecurityProtocolType.Tls12를 볼 때 심장 마비로 고통을 겪을 수 있습니다. 의미가 무엇인지 모릅니다. 잘못된 대상 지정 파일을 사용하여 프로그램을 작성하면 deeply mystifying exceptions이 발생할 수 있습니다.

및 기타 트릭. Post .NET 4.0 릴리스에서 만든 버그 수정은 [TargetFrameworkAttribute]에 따라 선택적으로 설정되며 버그에 대한 하위 호환성은 프로그램이 변경된 런타임 동작을 준수하지 않도록하는 데 중요합니다. 그리고 CLR은 appcompat 스위치로 끝납니다. 나는 CoreCLR의 소스 코드 파일을 가리킬 수 있지만,보기에는 너무 무섭다.

아니요, 대상으로 컴파일 된 프로그램을 만들면 .NET 4.0이 더 높은 버전에서 실행되는 것처럼 동작하지 않습니다. 여러분이 배운 레지스트리 키와 appcontext 스위치는 ServicePointManager.SecurityProtocol 속성에만 해당하는 이 고도로입니다. 그들은 당신이 이것을하기를 원하는 유일한 고객이 아니기 때문에 단순히 거기에 있습니다. TLS 버전은 오히려 중요합니다. 새 열거 형 값이 프로그램을 벗어나지 않도록하십시오.

+0

내가 묻는 것을 실제로 할 수없는 것 같아 답변으로 표시됩니다. 당신은 설명과 훌륭한 내용을 포함하고 있습니다. 한스 고마워. –

+0

@GregBogumil 당신이하려고하는 것은 최종 사용자에게 해킹을 강요하는 것입니다 - 컴파일 타겟을 업그레이드하고 싶지는 않지만 (왜?), 4.0에 존재하지 않는 TLS 값을 사용하도록 새로운 런타임을 강제하고 싶습니다 . 진정한 해결책은 목표를 변경하는 것입니다. –

3

특정 ServicePointManager.SecurityProtocol 결정이 난있는 4.6.1 프레임 워크 대 4의 일반적인 질문에 상당히 관련이 두말할 것없이 일반적인 대답과 관련이 없기 때문에 결정적인 대답은 아닙니다 (모든 경우는 아마도 구체적 일 것입니다). 특정 답변

이 여기에 설명되어

Mitigation: TLS Protocols는 .NET 프레임 워크 4.6,로 시작하는 System.Net.ServicePointManager 및 System.Net.Security.SslStream 클래스를 사용할 수 있습니다 다음 세 가지 프로토콜 중 하나 : Tls1.0, Tls1.1 또는 Tls 1.2. SSL3.0 프로토콜 및 RC4 암호는 이 지원되지 않습니다.

4.6+가 설치되어있는 경우 재 컴파일 O를, 기사에 설명 된대로, 다만 당신의 .config 파일에이 줄을 추가/W 그럼 당신은 참으로 프로그램의 동작을 변경할 수 있습니다 :

<configuration> 
    ... 
    <runtime> 
    ... 
    <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false" /> 
    </runtime> 
    ... 
</configuration> 
+1

해답을 가져 주셔서 감사합니다.나는 내가 결정하려고 노력하고있는 것을 강조하기 위해 제기 한 표본에 대해 매우 유효합니다. 나는 프레임 워크 4.0에 대해 컴파일 된 응용 프로그램이 프레임 워크 4.6.1을 사용하여 실행되도록하는 일반적인 경우에 대해 묻고 있습니다. CLR과 프레임 워크의 차이점보다 더 잘 알고 있으며 다른 CLR을 사용하여 실행하도록 강제 할 수 있다는 것을 이해합니다. 이 질문에 대한 대답은 프레임 워크 4.6.1을 대상으로 응용 프로그램을 다시 컴파일하지 않으면 수행 할 수 없다는 것을 기반으로합니다. –

+1

추가 런타임 구성 변경에 대해 특별히 감사드립니다. 많은 연구를 바탕으로 지금까지 내가 가진 최고의 대답은 레지스트리를 변경하는 것이 었습니다. 때로는 관리 직원이 필요한 클라이언트 컴퓨터에서. –