プログラム系統備忘録ブログ

記事中のコードは自己責任の下でご自由にどうぞ。

Visual Studio 2013から2015への乗り換えメモ

去る7/20にVS2015のRTMが公開されたので2013から移行した時のメモ書き記事です。Editionは2013・2015共にCommunity。

2013のアンインストールと2015のインストール

HDDの容量の都合で2013をを先にアンインストールしました。1時間強ほどかかりました。
開始早々、"Applying: Updating JPN resources..."な状態から数十分の間、プログレスバーが一切進まない状態になっていましたが、そのまま放置していれば完了していました。
2015のインストールは1〜2時間ほどで完了。一緒に.NET Framework 4.6も導入されたらしいです。
Language Packがまだ無さそうなのでUIは英語ですが特に問題はないでしょう。
2015/07/24 追記 http://www.microsoft.com/ja-JP/download/details.aspx?id=48157 からLanguagePackをダウンロード可能でした。
ダウンロード後に VS2015のOptionsから、Environment→International SettingsタブにてLanguageを選択して言語を変更します。

CodeMaidを導入

ソースコードを保存するたびに自動整形してくれる、大変便利な CodeMaid を導入。
2015にも既に対応されています。.xamlにも対応しているのが嬉しい所。 (2015/08/12 追記: .xamlのプロパティのインデント揃えをしてくれないので、xamlの整形はXAML Stylerに任せたほうが良さそうです。)
2013の設定内容をExportするのをすっかり忘れていたのでCleaningタブの内容をポチポチと変更。
"Insert blank line"のところは赤打ち消し線が多い設定にしています。

XAML Stylerを導入(2015/08/12 追加)

.xaml専用ですが、より高機能な整形機能を持つXAML Stylerを導入してみました。
とりあえずデフォルト設定でフォーマットしてみると、次のように素敵な整形をしてくれました。

<!-- Before -->
<TextBox Text="{Binding PropertyName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
         Name="TextBox"
         Margin="3">

<!-- After -->
<TextBox Name="TextBox"
         Margin="3"
         Text="{Binding PropertyName,
                        Mode=TwoWay,
                        UpdateSourceTrigger=PropertyChanged}">

ファイル保存時に自動整形することも可能なので、常に綺麗な状態に保てそうです。

"DisconnectedContext occurred"が発生する

WPFアプリケーションにて、

  • Window.OnClosed より後
  • Application.OnExit より手前

で "DisconnectedContext occurred" が発生することがありました。(発生しない場合もある)
WPFプロジェクトを新規作成した直後の状態でも発生しました。
完全なメッセージは以下の内容です。

Message: Managed Debugging Assistant 'DisconnectedContext' has detected a problem in 'C:\SomeWhere\Foobar.vshost.exe'.
Additional information: この RuntimeCallableWrapper の COM コンテキスト 0x5e3370 への変換に失敗して、エラー アプリケーションが入力同期呼び出しをディスパッチしているため、呼び出せません。 (HRESULT からの例外:0x8001010D (RPC_E_CANTCALLOUT_ININPUTSYNCCALL)) が発生しました。これは、通常この RuntimeCallableWrapper が作成された COM コンテキスト 0x5e3370 が切断されたか、他の処理を実行していてビジーのためコンテキスト変換を処理できないことが原因です。COM コンポーネント上の要求のサービスに使用されるプロキシは存在しないため、呼び出しは COM コンポーネントに対して直接行われます。これは、破損またはデータの損失を発生させる可能性があります。この問題を回避するには、その内部に存在する COM コンポーネントを示す RuntimeCallableWrappers の使用が完了するまで、すべての COM コンテキスト、アパートメント、およびスレッドが完全に有効であり、コンテキスト変換に使用できることを確認してください。

ひとまず情報が出てくるまでは、Exception Settingsウィンドウにて
Managed Debugging Assistants 中の DisconnectedContext のチェックを外しておくことにします。

ユーザータスクはどこへ?

2013では、タスク一覧ウィンドウにて ユーザータスク を管理可能でした。
しかし2015では、タスク一覧から見当たらなくなってしましました。
ちょっとしたメモ代わりに使っていたので少し困っています。せめて2013で書いていた内容を取り戻したいです。

2015/08/12 追記
stackoverflowの質問を見つけたのでリンクを張っておきます。

言語仕様書はどこに?(2015/07/24 追加)

MSDN にあるように、2013ではProgramFiles以下に.docxファイルという形で言語仕様書もインストールされました。
2015では、同様のパスに CSharp Language Specification.docx はあるにはあります。
しかし、Versionは5.0、ページ末尾のフッターのCopyrightは1999-2012表記であり、C#6.0の内容ではありません。
Download Centerから検索してみてもC#6.0の仕様書は見つかりませんでした。

null合体演算子の挙動について調べたかったのですが……。(a?.b.c とした場合の挙動や、戻り値voidのメソッド呼び出しが特別扱いされていないか、など)

2015/08/04 追記
stackoverflowでも質問がありましたが、今までのバージョンのようなレベルでの仕様書は無いみたいです。
roslynのC#6の新機能のページに概略はあります。Null-conditional operators の節には次の説明がありました。

int? first = customers?[0].Orders.Count();

This example is essentially equivalent to:

int? first = (customers != null) ? customers[0].Orders.Count() : null;

CodePlexのnotesを見ていたら、拡張メソッドの呼び出し方(インスタンスメソッドっぽく or 通常の静的メソッドとして)で扱いを変えるか、についての議論がありました。これは盲点。(結局はどうなったのでしょう?)

(C) a?.b.c() // c is an extension method. Does it mean "a == null ? null : a.b.c()" or "c(a == null ? null : a.b)" ?
(D) c(a?.b) // c is an extension method. Does it mean "a == null ? null : c(a.b)" or "c(a == null ? null : a.b)" ?

コードの細かい差(2015/07/25 追加)

2013で書いていた手元のコードに、次の内容がありました。

Foo((int)-0x80000000);  // -0x80000000はlongと型推論されるのでキャスト

しかし2015では電球マークのクイックヒントで "Cast is redundant."と言われました。
リテラルの扱いが変わったのでしょうか。
(int.MinValue を使用せずリテラルを直書きしていた意図は不明)