.Net 多目标出了问题?

发布于 2024-08-13 04:51:02 字数 1028 浏览 5 评论 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 /引用: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 Properties\AssemblyInfo.cs

现在的问题是为什么它会编译来自VS?它应该会像命令行编译一样失败。 相同的源在 VS2005 项目中失败(正确)。

谢谢, 弗罗林

I have a small dummy project in VS 2008, contains only the following code file

using System;

namespace FrameworkTest
{
    internal static class MessageQueueNative
    {
        struct TestStructure
        {
            public IntPtr aStatus;
        }

        public static void Main()
        {
            TestStructure pMgmtProps = new TestStructure { aStatus = IntPtr.Zero };
        }
    }
}

The project is set to target framework 2.0, even set the ToolsVersion to 2.0 manually in the project. Now the project is building just fine from VS and fails from command line (using 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

Now the question is why does it compile from VS? It should fail as it does in case of cmd line compile.
The same source fails (correctly) in VS2005 project.

Thanks,
florin

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

水中月 2024-08-20 04:51:02

多目标指的是CLR-版本定位,而不是C#-版本定位。

Multitargeting means CLR-version-targeting, not C#-version-targeting.

逆光下的微笑 2024-08-20 04:51:02

您正在使用 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;

它应该可以与所有版本一起编译。不过,看起来确实是一个错误……有趣的发现……

You're using a C# 3 compiler feature (the type initializer for TestStructure), thats why the code does not compile using csc from the command line (you're using v2) or from VS2005. My guess is VS2008 uses v3 of the C# compiler no matter which version of the framework you target, it just disables the features supported only by the newer versions of the .NET Framework.

If you change

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

to

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

it should compile with all versions. Does seem like a bug though... interesting find...

世界如花海般美丽 2024-08-20 04:51:02

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

Initializers like that are a C# 3.0 compiler feature, not a .NET platform feature. This was by design.

谜兔 2024-08-20 04:51:02

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

这是有意为之的,也是 LinqBridge(.NET 2 的 LINQ-to-Objects 实现)等解决方案能够按预期工作(并且有意义)的原因。

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

VS2008 always uses the C# 3 compiler, which allows you to use the newer syntax (in your sample the initializer). Since this is purely syntax of the language, the compiler can still target V2 of the framework, which is what the target actually does. You'll be able to run the generated output on a computer with V2 of the framework only.

This is intentional and is also why solutions such as LinqBridge (LINQ-to-Objects implementation for .NET 2) do work as expected (and make sense).

Use MSBUILD from VS2008 to build the solution and you'll get consistent results.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文