質問

現在マシン上で3.5 SP1を使用していますが、お客様は現在、SP1なしで3.5 SP1を使用しています。 VS2008で、ソリューションまたはプロジェクトをSP1なしの3.5にターゲットする方法がわかりません。インストールしたSP1の3.5のみです。

3.5(SP1なし)で使用できない関数またはコンストラクターを使用すると、コードは正しく機能しません。

つまり、コンパイル時に、SP1なしでは機能しないものを検出したい。

これまで、アプリケーションが破損するかどうかを確認するために(VMまたは別のマシンで)テストを行ってきました。問題は、アセンブリがロードされるときではなく、コードが実際に実行されるとき(実行時)にのみ破損することです。

1つの解決策は、VS2008 SP1なしのマシンを使用して、プロジェクトをコンパイルすることです。 ただし、ソースコードまたは生成されたアセンブリを分析することにより、3.5 SP1への依存関係(新しいAPIの使用など)を検出できるツールが必要です。

この質問では、Googleの力が十分ではありませんでした。ヒントはありますか?

役に立ちましたか?

解決

同じ問題が発生したばかりで、解決策を見つけました。このアプリケーションでは、System.Threading.WaitHandle.WaitOne(Int32)の呼び出しが問題になりました。サービスパックリリースで導入されたAPIへの参照がVisual Studioに気付かれずにコードにリークする方法の詳細については、 Krzysztof Cwalinaの投稿

良いニュースは、 Marcが彼の答えです、FxCopにはこれらのリークを検出する新しいルール。悪いニュースは、.NET Framework 3.5をターゲットにすると、FxCop 1.36でルールが破られることです。ただし、David Keanは、いくつかのXML構成ファイルを問題を修正します。指示に従いましたが、FxCopはサービスパックAPIへの参照を検出するようになりました。

他のヒント

これ? (FxCopのマルチターゲットルール)

こちらにあるコードを使用して検出できますインストールされた.NET Frameworks。

string Fx35RegistryKey = @ <!> quot; HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP \ v3.5 <!> quot ;; オブジェクトFx35ServicePack = Registry.GetValue(Fx35RegistryKey、<!> quot; SP <!> quot ;, null);

if(Fx35ServicePack == null ||(int)Fx35ServicePack <!> lt; 1)throw Exception(<!> quot; .NET Framework 3.5 SP1 is required。<!> quot;);

まだ試したことのない別のオプションがあります。 Visual Studioのドキュメントでは、ClickOnceインストーラーを具体的にターゲットにできると述べています。 .NET 3.5SP1フレームワーク。リンクをたどり、<!> quot; Targeting .NET Framework Version 3.5 SP1 <!> quot;を検索します。基本的に、次のいずれかを実行すると、インストーラーに3.5SP1のインストールが強制されます。

  • [公開オプション]ダイアログボックスでエラーURLを指定します。
  • [公開オプション]ダイアログボックスでスイート名を指定します。
  • [公開オプション]ダイアログボックスでデスクトップショートカットを作成します。
  • [アプリケーションファイル]ダイアログボックスのハッシュからファイルを除外します。
  • [署名]ページの[ClickOnceマニフェストに署名する]チェックボックスをオフにします。
  • System.Data.Entityアセンブリへの参照を追加します。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top