.Net многоцелевой пошли не так?

У меня есть небольшой фиктивный проект в VS 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, даже установите ToolsVersion на 2.0 вручную в проекте. Теперь проект строится очень хорошо из VS и терпит неудачу из командной строки (используя csc.exe 2.0).

C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Csc.exe / noconfig / nowarn: 1701,1702 / errorreport: приглашение / предупреждение:4 /define:DEBUG;TRACE / ссылка:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /debug+ /debug:full /filealign:512 /optimize- /out:obj\Debug\FrameworksTest.exe /target:exe Class1.cs Properties\AssemblyInfo.cs

Теперь вопрос: почему он компилируется из VS? Он должен потерпеть неудачу, как в случае компиляции строки cmd. Тот же источник не работает (правильно) в проекте VS2005.

Спасибо, флорин

4 ответа

Решение

Мультитаргетинг означает таргетинг на CLR, а не таргетинг на C#.

Подобные инициализаторы являются функцией компилятора C# 3.0, а не платформой.NET. Это было разработано.

VS2008 всегда использует компилятор C# 3, который позволяет вам использовать более новый синтаксис (в вашем примере инициализатор). Так как это чисто синтаксис языка, компилятор все еще может нацеливаться на V2 фреймворка, что фактически и делает цель. Вы сможете запустить сгенерированный вывод только на компьютере с V2 платформы.

Это сделано намеренно, и поэтому решения, такие как LinqBridge (реализация LINQ-to-Objects для.NET 2), работают должным образом (и имеют смысл).

Используйте MSBUILD из VS2008 для создания решения, и вы получите последовательные результаты.

Вы используете функцию компилятора C# 3 (инициализатор типа для TestStructure), поэтому код не компилируется с использованием csc из командной строки (вы используете v2) или из VS2005. Я предполагаю, что VS2008 использует v3 компилятора C# независимо от того, на какую версию платформы вы нацеливаетесь, он просто отключает функции, поддерживаемые только более новыми версиями.NET Framework.

Если вы измените

TestStructure pMgmtProps = new TestStructure { aStatus = IntPtr.Zero };

в

TestStructure pMgmtProps = new TestStructure();
pMgmtProps.aStatus = IntPtr.Zero;

он должен компилироваться со всеми версиями. Это похоже на ошибку, хотя... интересная находка...

Другие вопросы по тегам