2012-07-11 3 views
1

C#으로 작성된 .NET Framework 3.5를 사용하는 .NET 응용 프로그램이 있습니다. 응용 프로그램은 BeginInvoke를 사용하여 대리자를 비동기 적으로 호출합니다. Visual Studio 2012 RC를 사용하여 컴파일 할 때 응용 프로그램이 제대로 작동하지만 Visual Studio 2010 SP1 (주 스레드가 비동기 대의원이 완료되기를 기다리는 WaitOne에서 멈추지 만 실행되지 않음)로 컴파일 할 때 고정됩니다.Visual Studio 2012 .NET 다중 대상 지정 및 비동기 콜백

버그가 잘못 설계된 동기화 상태 일 가능성이 있지만 놀랍지 만 VS 2012에서 작동하고 VS 2010에서 작동하지 않는 이유는 두 프레임 워크 모두에서 동일한 프레임 워크 버전을 대상으로하고 있기 때문입니다.

Visual Studio for .NET에서 다중 대상 지정은 어떻게 구현됩니까? 동일한 프레임 워크 버전을 타겟팅 할 때 실행 가능 동작이 동일해야하거나 사용되는 Visual Studio 버전에 따라 일부 (컴파일러 프런트 엔드 또는 런타임 라이브러리의 일부)가 있어야합니까?

+1

Microsoft가 버그를 자동으로 고쳤다는 것에 대해 놀라지 않는 이유는 무엇입니까? – leppie

+0

당신은 이것에 대한 작은 repro을 가지고 있습니까? –

+0

@DavidKean 설명은 이미 답변에 있습니다 (foreach 변수의 다른 범위). 따라서 더 이상이 문제에 관심이 없습니다. – Suma

답변

2

예, 차이가 있습니다. 사용되는 C# 컴파일러는 다릅니다. VS2008 targeting .NET 2.0 doesn't stop me from using C# 3 features을 참조하십시오. 참고 : 이는 Visual C++에서 다중 타겟팅이 작동하는 방식과 다릅니다. Visual C++에서는 대상을 지정할 때 이전 버전에서 전체 도구 체인을 사용합니다.

나를 때리는 문제는 foreach 변수의 수명주기가 다릅니다. 대리자에서 변수를 캡처하는 동안 VS 2012에서 각 대리자는 자신의 버전 인 변수 in VS 2010 it did not을 캡처했습니다.

VS 2012는 새로운 동작을 구현하는 C# 5 컴파일러를 사용하고 있습니다. 변경 내용은 Visual C# Breaking Changes in Visual Studio 2012 RC에 설명되어 있습니다. 또한 What else is new in C# 5? 또는 Lifting ForEach, Breaking Change in Visual Studio 2012에 설명되어 있습니다.

+0

"새 동작이 정의되어 있는지 아직 찾지 못했습니다." - 공식적인 [Visual C# Breaking Changes] (http://msdn.microsoft.com/en-us/library/hh678682 (v = vs.110) .aspx) 페이지에서 특별히 언급되었으므로 그렇지 않으면 가정 할 이유가 있습니다. 그리고 VS 2012는 4.0이 아닌 기본적으로 C# 5.0을 사용합니다. 사양 문서가 아직 업데이트되지 않았습니다. (내가 아는 한, 그러나 특별히 검사하지는 않았지만, C# 4.0에서도 동작이 정의되었지만 다르게 정의되었으므로 모든 C# 4.0 컴파일러는'foreach' 변수를 다시 사용해야합니다.) – hvd

+0

@hvd 명확한 설명을 주셔서 감사합니다. 답변을 업데이트 중입니다. – Suma