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 };
        }
    }
}

该项目设置为目标框架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 /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

4 回答 4

3

多目标意味着CLR -version-targeting,而不是C# -version-targeting。

于 2009-12-02T16:25:12.173 回答
1

像这样的初始化程序是 C# 3.0编译器功能,而不是.NET 平台功能。这是设计使然。

于 2009-12-02T16:27:06.790 回答
1

VS2008 始终使用 C# 3 编译器,它允许您使用更新的语法(在您的示例中为初始化程序)。由于这纯粹是语言的语法,编译器仍然可以以框架的 V2 为目标,这正是目标实际所做的。您将能够在仅具有 V2 框架的计算机上运行生成的输出。

这是有意的,也是为什么诸如 LinqBridge(.NET 2 的 LINQ-to-Objects 实现)之类的解决方案可以按预期工作(并且有意义)的原因。

使用 VS2008 中的 MSBUILD 构建解决方案,您将获得一致的结果。

于 2009-12-02T16:30:59.077 回答
1

您正在使用 C# 3 编译器功能(TestStructure 的类型初始化程序),这就是为什么代码不能从命令行(您使用的是 v2)或 VS2005 使用 csc 编译的原因。我的猜测是 VS2008 使用 v3 的 C# 编译器,无论您针对哪个版本的框架,它只是禁用了仅由较新版本的 .NET Framework 支持的功能。

如果你改变

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

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

它应该与所有版本一起编译。虽然看起来像一个错误......有趣的发现......

于 2009-12-02T16:20:37.893 回答