Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

VSCodeで.NET Frameworkを利用する。-.NET Framework利用のための手続き

2019年に取り組んでみようと考えた言語がC#だ。先日の三連休中、初心者向けの本を3冊読んだ。これまでの経験を前提に、C#は非常に馴染みやすさを感じた。「なぜもっと早くに取り組まなかった!?」と思うほどだった。

C#に限らず、初心者向けのサンプル・コードと言えばコンソール向けのものだ。C#の開発環境と言えば、事実上Visual Studioなのだが、コンソール向けの開発には重厚過ぎるように感じる。VSCodeにもC#拡張が提供されておりコーディング可能なのだが、Visual Studioと異なり基盤は.NET Coreだ。.Net frameworkではない。
コンソール向けのコードに基づいた練習に.NET Coreが不足なわけではない。とはいえMessageBoxのような、お馴染みのWindows Formに由来するものが利用できないのは、少し勿体ないように思う。

一連のエントリではVSCodeから.NET Frameworkを利用するための手続きについて紹介する。このエントリでは2を取り上げる。

  1. 前置きとして"--target-framework-override"の紹介
  2. .NET Framework利用のための手続き

事前準備

.NET Frameworkを利用するとはいえ、.NET Coreは必要だ。またVSCode用のC#拡張もインストールしておく。このエントリの記述は、次の環境に基づいている。

VSCode 1.30.2
.NET Core 2.2.102
.NET Framework 4.6.2

dotnet.microsoft.com
marketplace.visualstudio.com

コンソール・アプリケーションの開発準備

VSCodeを起動したら、VSCode内のコンソールから次のコマンドを実行する。

dotnet new console --target-framework-override <TFM> -lang c# -o <folder name>

<TFM>には、目的の.NET Frameworkのターゲットフレームワークを指定する。私は「net462」とした。目的のバージョンとTFMは、次のサイトで確認することができる。
<folder name>はVisual Studioで開発する場合のプロジェクト名に該当する。カレント・フォルダに指定した名前のフォルダ名が作成される。私は「msgbox」とした。
f:id:espio999:20190122145634p:plain
docs.microsoft.com

プロジェクト・ファイルの編集

コマンドを実行すると必要なフォルダ、ファイルが自動生成される。次のファイルが生成されていることを確認する。

プロジェクト・ファイル msgbox.csproj
ソースコード Program.cs

Visual Studioでコンソール・アプリケーションを開発するとき、

using System.Windows.Forms

と記述するだけでは「アセンブリの参照がない」と警告され、MessageBoxが利用できなかった経験はないだろうか。VisualStudioでは参照設定を変更するのだが、VSCodeでもプロジェクト・ファイルを編集して同様の対応をしなければならない。
「using」で参照するコンポーネントは、プロジェクト・ファイル内でもReferenceタグで指定する必要がある。ここではItemGroupタグに続く一連の記述だ。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net462</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="System.Windows.Forms" />
  </ItemGroup>
</Project>

ソースコードの編集

自動生成されたソースコードを編集する。ソースコードを編集するとき、Windows.Formクラスが参照できていることが確認できる。もちろんMessageBoxも参照可能だ。
f:id:espio999:20190122145745p:plain
f:id:espio999:20190122145802p:plain
今回の検証では、次のコードで完成とした。

using System;
using System.Windows.Forms;

namespace msgbox
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            MessageBox.Show("!! Hello World !!");
        }
    }
}

デバッグ実行

デバッグ実行に際し、次の2ファイルの作成を求められると思う。

launch.jsonの次の箇所を編集する。2行存在していることに注意。

"program": "${workspaceFolder}/bin/Debug/<insert-target-framework-here>/<insert-project-name-here>.dll",

Visual Studio同様、フォルダ構成は左ペインのエクスプローラを参照すると良い。
このエントリでは次のように置き換えた。.dllの拡張子、".dll"を「.exe」と書き直していることにも注意。

<insert-target-framework-here> net462
<insert-project-name-here>.dll msgbox.exe

f:id:espio999:20190122150236p:plain

tasks.jsの生成に際し、テンプレートを選択する。選ぶのは「.NET Core」だ。MSBuildではない。
生成されたtask.jsonは、何も編集しない。
f:id:espio999:20190122150137p:plain

改めてデバッグを実行すると、コンソールにテキスト表示されると同時に、メッセージボックスも表示される。
f:id:espio999:20190122150259p:plain