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

マルチターゲティングとは、 C#バージョンターゲティングではなく、CLRバージョンターゲティングを意味します。

于 2009-12-02T16:25:12.173 に答える
1

C#3コンパイラ機能(TestStructureの型初期化子)を使用しているため、コマンドライン(v2を使用)またはVS2005からcscを使用してコードをコンパイルしません。私の推測では、VS2008はターゲットとするフレームワークのバージョンに関係なくC#コンパイラのv3を使用し、新しいバージョンの.NETFrameworkでのみサポートされる機能を無効にするだけです。

変更した場合

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

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

すべてのバージョンでコンパイルする必要があります。しかし、バグのように見えます...興味深い発見...

于 2009-12-02T16:20:37.893 に答える
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 に答える