.NET Multargeting이 잘못 되었습니까?
-
11-09-2019 - |
문제
2008 년에 작은 더미 프로젝트가 있으며 다음 코드 파일 만 포함합니다.
using System;
namespace FrameworkTest
{
internal static class MessageQueueNative
{
struct TestStructure
{
public IntPtr aStatus;
}
public static void Main()
{
TestStructure pMgmtProps = new TestStructure { aStatus = IntPtr.Zero };
}
}
}
이 프로젝트는 프레임 워크 2.0을 대상으로 설정되었으며 프로젝트에서 도구 버전을 수동으로 2.0으로 설정했습니다. 이제 프로젝트는 VS에서 잘 구축되고 있으며 명령 줄에서 실패합니다 (CSC.EXE 2.0 사용).
C : Windows Microsoft.net Framework V2.0.50727 CSC.EXE /NOCONFIG /NOWARN : 1701,1702 /ERRORREPORT : PROMPT /WARN : 4 /DEFINE; DEBUG; TRACE /Reference : C : Windows Microsoft. net framework v2.0.50727 system.data.dll /reference:c:cindowsmicrosoft.netframeworkv2.0.50727system.dll /reference:c:cindowsmicrosoft.netfram v2. 0.50727 system.xml.dll /debug+ /debug : full /filealign : 512 /Optimize- /out: debugframeworkstest.exe /target : exe class1.cs properties assemblyinfo.cs
이제 문제는 왜 VS에서 컴파일 되는가? CMD 라인 컴파일의 경우와 같이 실패해야합니다. VS2005 프로젝트에서 동일한 소스가 (올바르게) 실패합니다.
고마워, 플로린
해결책
멀티 타겟팅 수단 CLR-버전-표적화 씨#-버전 타겟팅.
다른 팁
C# 3 컴파일러 기능 (TestStructure의 유형 초기화기)을 사용하고 있으므로 코드가 명령 줄 (v2를 사용하고 있음) 또는 vs2005에서 CSC를 사용하여 컴파일하지 않는 이유입니다. 내 추측은 VS2008이 C# 컴파일러의 v3을 사용하여 어떤 버전의 프레임 워크를 대상으로하든 .net 프레임 워크의 최신 버전에서만 지원되는 기능을 비활성화합니다.
당신이 변하면
TestStructure pMgmtProps = new TestStructure { aStatus = IntPtr.Zero };
에게
TestStructure pMgmtProps = new TestStructure();
pMgmtProps.aStatus = IntPtr.Zero;
모든 버전으로 컴파일해야합니다. 그래도 버그처럼 보인다 ... 흥미로운 찾기 ...
이와 같은 초기화기는 C# 3.0입니다 컴파일러 기능이 아닙니다 .NET 플랫폼 특징. 이것은 디자인에 의한 것입니다.
vs2008은 항상 C# 3 컴파일러를 사용하여 최신 구문을 사용할 수 있습니다 (샘플에서 이니셜 라이저). 이것은 순전히 언어의 구문이므로 컴파일러는 여전히 프레임 워크의 V2를 타겟팅 할 수 있습니다. 이것이 바로 대상이 실제로하는 일입니다. 프레임 워크의 V2 만있는 컴퓨터에서 생성 된 출력을 실행할 수 있습니다.
이것이 의도적이며 Linqbridge (.NET 2를위한 LINQ-to-Objects 구현)와 같은 솔루션이 예상대로 작동하고 의미가있는 이유이기도합니다.
VS2008의 MSBuild를 사용하여 솔루션을 구축하면 일관된 결과를 얻을 수 있습니다.