문제

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를 사용하여 솔루션을 구축하면 일관된 결과를 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top