既存のVisual Studioプロジェクトを、Visual Studio Codeで開くとデバッガが動かなかった件について
まえおき
皆さん、ゴールデンウィークもコーディング三昧でしたでしょうか。最近Qiitaにお世話になることがおおいのですが、いつも役に立たないコメントを残すばかりで、ちっとも"貢献"していないので、ちょっとは役に立つ記事を投稿してみようかと思います。
私はポンコツですので、基本、誰もが大丈夫なところで躓くようです。そういうわけで、世にはびこるポンコツコーダーのために、ちょっとしたワークアラウンドを見つけ次第投稿しようと思っています。よろしくお願いいたします。
Visual Studio Codeについて
さて、表題の件ですが、なんとなくC#のお勉強に飽きてきたので、久々にPythonでも書きたいなー、でも、長ーいコードをJupyter notebookでひたすら書くというのも嫌だし、エディタでも探すかと思ってググったところ、Visual Studio Codeなるエディタがよいと評判だったので早速ダウンロード、使用してみました。エディタ自体はとてもよく、いつもならおせっかいすぎてイラっとしがちなマイクロソフト的サジェスチョンも、Visual Studio Codeに関しては、むしろピンポイントでえらく助かる。Windows 10は常にイラっとする代物ですが、開発環境に関してはマイクロソフトはいつもいい仕事をしています(その辺の優秀な人材を、もっとOSのほうに回す気はないのでしょうか・・・)。
そのようなわけで、マイクロソフト製=めんどくさいという偏見を抱いている私でも、おーっ!とうなってしまうエディタなので、ぜひ皆さんも使ってみませう。
デバッガが動かない
と、エディタ自体はすごく出来がいいのですが、Visual Studio 2017で編集していた既存のプロジェクトを開いてみると、デバッガが動かない。新しいエディタの導入にはつきものなので、文句はないのですが、.Net周りの理解がなっていない私のようなポンコツにとっては、理解不能な事態。ちなみに、そん時の画面はこんな感じ。
なんか、すごい怒られているのはわかるのですが、基本OK→OKみたいな感じで操作していただけで、そんなに悪いことをしている自覚はありません(ポンコツなので)。とはいえ、自覚があろうがなかろうが、ダメなものはダメ、それが計算機、というわけで、色々調べつつ、デバッガを動かすところまでもっていくことに。
環境について
たぶん、私の環境が悪いのでしょう。そうに決まっている…というわけで、一応、この現象が発生した環境について、記載しておきます。
- OSはWindows 10、アップデートはまじめにやっているので最新(これは関係ないと思う)
- 元の開発環境は、Visual Studio 2017。どうせ趣味のプロジェクトなので、ビルド設定はウィザードで全部「はい」にしているだけ(これがのちに災いしているっぽい)
- プロジェクトの種別?は普通のコンソールアプリケーション。
- .NET Coreなんてものの存在すら知らないので、Visual Studio Codeが.NET Coreという仕組みを経由して、ビルドしたり実行したりしているのも知らない(これは環境ではなかった、私の頭の中身の話だ)
- プロジェクトは、他のプロジェクトを含むソリューションの一部。
- また、同じソリューションに存在するほかのプロジェクト(ライブラリ)に依存している。
ソフトウェアも人を選ぶので、こういうことは、イケメンのお兄さんには発生しません。動かなかった場合でも、ソフトウェアを責めるのではなく、適当な環境で作業している自分を責めるべきなのです。原因になっていそうなのは、.NET Coreの存在を理解していない私の頭、そして、ビルド設定などいつぞやのものと全部「はい」で済ませてしまう習性です。
.NET Coreについて
詳しくは知りませんが、コマンドラインから.NETアプリをビルドしたり、実行したりできる仕組みのこと。dotnet ほげほげというコマンドでいろいろできる模様です。いやー、こんな便利なものがあるなら初めから教えておいてくれないと。こっちは知らないんだから。
ともかく、Visual Studio Codeから編集中のプロジェクトをビルドしたりデバッグしたりする場合、この.Net Coreってのを経由するようです。で、C#のOminiSharp(Intelli Senseをどこでも使えるようにする仕組み)プラグインだと思うのですが、既存のVSプロジェクトを読み込むと、自動で.Net Core用の設定ファイルも生成してくれます。それで何の問題もないように思えるのですが、どうも生成されたファイルの様子がおかしい(上記スクリーンショット参照)。
よくわからないけど、動いた方法について
どうやら、私のプロジェクトのビルド設定が悪かったらしく、構成を正しく読み込めていないようです。こうなったら、手動でどうにかするしかない…そんなわけで色々調べたのですが、問題のファイル(プロジェクトフォルダ直下にある.vscode/launch.json)のフォーマットが全く分からない。そんなわけで、手動で.NET Coreなるものから、読み込んだプロジェクトを起動できるよう設定することに。
.Net Core用の設定を作る。
多分、他にまともな方法(launch.jsonをちゃんと書くというような)があるのだと思いますが、私はポンコツなので、設定ファイルは書けません。いつも、コンピューターに書いてもらいます。そのようなわけで、次のような操作を行いました。
- Visual Studio Codeの下部にあるTERMINALタブを開く。
- プロジェクトフォルダの下で、おもむろに、dotnet new consoleとやる。プロジェクトの設定ファイルを書き換えますよ、という警告が出るので、やばいと思ったら一度中断して、一旦ローカルにコミットするなりなんなりしておいた方がよいと思います(なぜか、メインモジュールのProgram.csがHello worldに書き換えられていたので)
- 念のため、dotnet buildとタイプする。この時点でなぜか、AssemblyInfo.csの定義が重複しているといわれてしまう。なんでやねん。CompanyとかCopyrightみたいなどうでもよさげなプロパティなので全部消す(冒頭で言ったように、自分がローカルで勝手にやっていることなので平気…ですが、そうじゃない人はちゃんと確認して、処理したほうがいいと思います)
- もう一度、dotnet buildとやる。すると、当該のプロジェクトから参照していたほかのプロジェクトが見つからない的なエラーが出るので、dotnet add reference [参照先プロジェクトの.csprojファイル]というコマンドをたたく。これで、ちゃんと参照ができる模様(おー、高性能)
- ここで、dotnet runとやる。これでプログラムが起動すればOKなのですが、Visual Studio Codeから「64bitバイナリじゃないとデバッガ動かないよ~」的なことを言われます。え?そんなはずは…と思ってVisual Studioに戻り、ソリューションエクスプローラーから、プロジェクト右クリック→プロパティとやってみると、「32bitを優先」にチェックが…(それまでずっと、64bitでビルドされていると思ってましたよ私は)。こそっと修正して、もう一度これらの手順をやり直す。
- 多分、デバッガが動く…はず。
ためになるどうかは、あなた次第。ちょっと探しても、情報が見当たらなかったので、一応残しておくことにしました。
教訓
Visual Studio Codeで、既存のVisual Studioのプロジェクトを編集/デバッグしたい場合、Visual Studio側でちゃんと設定していないとデバッガが動かない。どうやら、
- .NET Coreに対応した状態にしておく(自分でちゃんとした設定を作るか、私のようなポンコツなら、Visual Studio CodeのTERMINALからコマンドを叩く。これはプロジェクトの設定を変更するので、不用意にはやらないほうがいいと思うが、コマンド三つなので手間はかからない)
- 64bitでビルドされてないと、デバッガが動いてくれない。
ということらしいです。普段不真面目だと、こういうところでツケを払うことになるのですね。ちなみに、下記が動いた状態の設定ファイル(launch.json)です。なんとなくで動いてしまったので、本当にこいつが根本的な原因だったのか自信がないですが、参考までに。
あと、tasks.jsonというものありまして、自動生成された際には、このファイルの中身が、自分が動かしたいプロジェクトではなく、参照先のライブラリのプロジェクトを参照していたようです。dotnet new consoleで再生成されたのか、見てみたらちゃんと開きたいプロジェクトのほうに書き換えられていました。
(tasks.json)
最後に
なお、Visual Studio Codeに関しては、一応おすすめです。使いやすいと思います(めっちゃ軽いし)。今のところ不満はなく、Atomとか好きな人なら気にいるのではないかと。プラグインも豊富で、たとえばC#ならソースを読み込んだタイミングで、エディタ側から「こーゆープラグインあるでー」みたいなことを言ってきてくれます。めっちゃ親切です。ジャストなタイミングで、ペロッと出てくるので、うざっって感じは全くしません。ことあるごとに「更新する?再起動する?Poeple使う?コルタナです」と迫ってくるあいつに比べたら、可愛いことこのうえない。
普通にVimバインディングとかもありますので、中途半端なVim使いなら乗り換える価値ありかも(がちで使っている人なら、あれがない、これがないとなりそうですが)