◆ デフォルトプロジェクトなら エラーが出る参照と using を削除
  ◆ 3.5 で動かない機能はいろいろあるので 使ってるなら削除
◆ 基本はこれだけだけど ビルドまではできるけどデバッグ実行できない場合があった
  ◆ Express だとダメ?
◆ 新規に 3.5 が必要ならプロジェクト作るときに 3.5 にしておくと削除する手間がかからない

3.5 が未だにサポートされてるせいで 3.5 で動作確認する必要がありました
そのままターゲットフレームを変えるだけだとエラーが出るのでいくつか修正します

デフォルトのものだと 参照から以下のものを削除します

  • Microsoft.CSharp
  • System.Net.Http
  • System.Xaml

それから各ファイルの using からこれを削除します

using System.Threading.Tasks;

とりあえずこれで実行できるようになります

3.5 で実行するとボタンがちょっとキレイでした

wpf35

これって Windows のバージョンじゃなくて .NET Framework のバージョンだったんですね

4 以降だと一色で灰色っていう地味なデザインです

wpf40



(追記)
バージョンだけじゃなくて OS も関係ありそうです
4.7.1 がインストールされている Windows7 だと 3.5 に近い見た目でした

Express だとダメ?

上の手順でデバッグ実行もできて ブレークポイントで停止したりもできたのですが できない環境もありました
動かなかったのは別の PC で VS 2017 Express です
動きたのは VS 2017 Community でした
Express だとなにか違いでもあるのでしょうか?

ビルドまではできたので デバッガ周りの問題みたいです
デバッグ開始時に互換性とか相互運用性とかそんな感じのメッセージ付きでデバッグに失敗しましたとダイアログがでました
デバッグなし実行を使えば実行はできたので 手抜きにダイアログでデータ表示するデバッグでやり過ごしたのですが いったい何が悪いんでしょうね

厄介だったのが デバッガの接続だけが失敗しているだけみたいでアプリケーションの起動は成功していました
つまりアプリケーションのプロセスが残っています
そのせいで削除ができず ちょっとコードを修正して再実行させようとしたらリトライ 10 回したけど書き込めなかったー みたいなエラーが出てまた困りました

ビルドまではできていたのと VS の Express と Community はデバッガ周りがちょっと違うのでその影響なのかなと思ってます



(追記)

原因がわかりました
プロジェクトのプロパティの「デバッグ」タブの下の方にある「ネイティブコードデバッグを有効にする」というチェックがオンになっていると 動かないようです
このチェックをはずせば 3.5 でもデバッグ実行ができます
ネイティブコードデバッグが何かよくわかってませんけど 3.5 の頃の Framework では対応してないみたいです

ところで この名前に聞き覚えがあったのでブログ内検索するとこの記事が引っかかりました
このときはネイティブコードデバッグを有効にしないとデバッガがちゃんと動かないという現象でした
Framework バージョンによって切り替えるべき項目として覚えておくと良いかもしれませんね


ところで 原因は単純な部分でしたが見つけるまで結構苦労しました
動くプロジェクトと動かないプロジェクトで .proj ファイルを見比べても全然それらしい違いがなくて 最終的に動いてる方の .proj ファイルを動かない方にまるごと置き換えてみたのに動きませんでした
sln ファイルにはそれらしい項目はないですし もしかして .proj にはない VisualStudio 内で管理している部分で違いがあるのかもと思い始めるほどです
.vs フォルダにあるのはバイナリファイルですし Express だと最初から 3.5 向けに作らないとどうしようもないの?とか考えながら 念の為 VisualStudio の画面内でプロジェクトやソリューションのプロパティをひとつずつ見比べていたら ネイティブコードデバッグのチェック状態の違いを見つけました

.proj じゃないならどこで設定してるんだろう と探していると有効になってる方のプロジェクトのみ .proj.user ファイルが存在しました
中には

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<EnableUnmanagedDebugging>true</EnableUnmanagedDebugging>
</PropertyGroup>

という項目があって この EnableUnmanagedDebugging がネイティブコードデバッグを指してるようです
自分で作った覚えがないのにときどき存在するのですが 一体何が理由で作られるのでしょうか
普通は .proj の方が変更されそうですけど

新規プロジェクトなら

すでに 4 以降のプロジェクトを 3.5 にするのはちょっと面倒がありましたが 最初から 3.5 で作ることがあるなら 作成時に Framework のバージョンが指定すると手間が省けます
WPF やコンソールなどを選ぶところの上に 「.NET Framework 4.6.2」 みたいなのがあるので そこを変えればデフォルトのバージョンが変更できます
3.5 にしておくと 4 以上用の using や参照がないので削除しなくて済みます

既存のものを 3.5 で確認したい場合は 新規で作ったプロジェクトに移動してくるのが大変そうなので 既存プロジェクトで using と参照を消したほうがいいかもしれません