2009-12-02 1 views
0

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

Проект устанавливается целевой Framework 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: prompt/warn: 4/define: DEBUG; TRACE/reference: C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ System.Data.dll/reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll/ссылка: 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 Свойства \ AssemblyInfo.cs

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

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

+2

и ошибка ...? –

+0

Ошибка в том, что VS компилируется и MsBuild терпит неудачу. Это означает, что я не могу использовать VS для проверки кода перед выполнением кода. Я считаю, что здесь MsBuild имеет правильное поведение. В нашей установке у нас есть VS2008, проект имеет значение ToolsVersion, равное 2.0, и целевую структуру, установленную в 2.0. MsBuild использует правильную ToolsVersion (2.0), в то время как VS использует 3.0 или 3.5 (я точно не знаю). – florin

ответ

3

Multitargeting означает CLR -version таргетинг, не C# -версия таргетингом.

+0

И CLR - это версия 2 для .NET 2.0 через .NET 3.5. Нет повторной версии CLR до .NET 4. –

1

Вы используете 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; 

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

+1

Это не ошибка, это особенность. Шутки в сторону. – Lucero

1

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

1

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

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

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

+0

Как вы скомпилируете непосредственно с MsBuild из VS? Спасибо, florin – florin

+0

Извините, я был не очень точен с моей формулировкой. Я имел в виду использовать ту же версию MSBUILD, что и VS2008, что и у .NET Framework V3.5, обычно здесь: 'C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe ' – Lucero