4

私は VS2005 ソリューションを持っていて、新年に向けて VS2005 をやめたいと思っていました。アップグレード プロセスにはおおむね満足しており、ビルド スクリプトのほとんどがまだ機能しているのを見てうれしい驚きを覚えました。

マルチターゲット機能に関する質問です。サーバーに .NET 3.5 がインストールされていないため、引き続き .NET 2.0 をターゲットにする必要があります。それはほとんどうまくいきましたが、次のようなことができることがわかりました

var returnMe = "result: " + result.ToString();

...それでもプロジェクトを正常にデバッグします。

そのコードをビルド サーバーにアップロードすると、「var」が定義されていないと言ってビルドが失敗しました。

それで、私はどれを期待すべきですか?

  1. .NET 2.0 を対象とする VS2008 は、C# 3 を実行しようとするとエラーをスローするはずです
  2. ビルド サーバーは、私が .NET 2.0 をターゲットにしていることを認識しており、私が何をしているのかを理解し、2.0 互換のバイナリにコンパイルする必要があります。

何か案は?

4

5 に答える 5

5

問題は、ビルド サーバーに適切なコンパイラがないことにあるようです。ワークステーションで構築できますよね?

.NET 3.0 の「機能」の多くは、コンパイル時に CLR 2 コードに戻る単なる構文ビットです。varはその 1 つです。コンパイル時に、コンパイラは var を適切な型に変換します。

これに関する非常に有益な投稿がhttp://weblogs.asp.net/shahar/archive/2008/01/23/use-c-3-features-from-c-2-and-net-2-0にあります。 -code.aspx

于 2010-01-22T16:25:08.940 に答える
1

他の人が言ったように、C# 3.0 コンパイラで .NET 2.0 ランタイムをターゲットにする場合、C# 3.0 機能を使用できます。

これに関連するあまり知られていない事実は、独自の LINQ 実装を提供すれば、.NET 2.0 で LINQ を使用することさえできるということです。

「select」および「where」演算子を有効にする例を次に示します。

namespace System.Runtime.CompilerServices
{
    // defining this attribute allows using extension methods with .NET 2.0
    [AttributeUsage(AttributeTargets.Method)]
    public sealed class ExtensionAttribute : Attribute {}
}

namespace System
{
    public delegate R Func<A, R>(A arg0);
}

namespace System.Linq
{
    public static class Enumerable
    {
        public static IEnumerable<R> Select<T, R>(this IEnumerable<T> input, Func<T, R> f)
        {
            foreach (T element in input)
                yield return f(element);
        }

        public static IEnumerable<T> Where<T>(this IEnumerable<T> input, Func<T, bool> f)
        {
            foreach (T element in input) {
                if (f(element))
                    yield return element;
            }
        }
    }

.NET 2.0 で LINQ をフルに活用したい場合は、Mono のバージョンの System.Core をアプリケーションに同梱できます。

于 2010-01-22T18:45:48.917 に答える
1

Visual Studio 2008 を使用して 2.0 ランタイムをターゲットにする場合でも、C# コンパイラの 3.0 バージョンを使用してコードをコンパイルします。CLR ランタイム自体は、2005 年から 2008 年の間にあまり変更されていません。実際には、コア CLR へのサービス パックと、いくつかの新しいライブラリ (特に System.Core.dll) の追加にすぎません。

したがって、2008 年に追加された機能の大部分は、2.0 ランタイムで問題なく動作します。これは完全に合法であり、2.0 で動作しない機能を使用しようとすると、ビルド時または公開時にエラーが発生します。

于 2010-01-22T16:21:47.843 に答える
0

次のライブラリ/テクノロジを使用しない場合:

  • Windows プレゼンテーション ファウンデーション (WPF)
  • Windows コミュニケーション ファンデーション (WCF)
  • Windows ワークフロー ファウンデーション (WWF)
  • Windows カードスペース (WCS)

とにかく徹底的なテストをお勧めしますが、あなたは多かれ少なかれ安全側にいます.

varオンザフライの構文チェック、IntelliSence、およびおそらく他のものに関しては、VS2008がフレームワークのターゲットバージョンを気にしないという理由だけで、.Net 3.0機能などを使用できます。私が知る限り、VS2010はこれらのことに注意をvar x = ...払うため、 2.0 フレームワーク バージョンを対象とする場合、" " 構造を正常にコンパイルできなくなります。

于 2010-01-22T16:35:54.327 に答える
0

特定のビルドをターゲットにしたい場合は、構成設定を介してこれを行うことができます (これはまさに私が 70-536 試験のために読んでいたもので、非常にドライなものです!)。

app.exe.config ファイルに次のようなものを追加します

<configuration>
   <startup>
      <requiredRuntime version="v2.0.50727"/>
   </startup>
</configuration>

次に、マシンに関係なく、すべてのビルドで同じバージョンを使用するように強制できます。これにより、デバッグでも正しいバージョンを使用するように強制できます。

于 2010-01-22T16:29:12.233 に答える