.Net многоцелевой пошли не так? - PullRequest
0 голосов
/ 02 декабря 2009

У меня есть небольшой фиктивный проект в 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 ]

3 голосов
/ 02 декабря 2009

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

1 голос
/ 02 декабря 2009

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

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

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

1 голос
/ 02 декабря 2009

Подобные инициализаторы - это функция компилятора C # 3.0 , а не .NET platform Это было разработано.

1 голос
/ 02 декабря 2009

Вы используете функцию компилятора 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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...