C#でフォームを作成

コンピュータ
前回VisualStudioを使わないC#のコンパイルでコマンドベースの実行ファイル(.exe)を作れることは確認しました。
C#でHelloWorld【VisualStudioを使わない方法】
以前VisualStudio2019をインストールしてC#を試してみましたがVisualStudioをインストールしなくてもc#のコンパイルが出来るようです。私のWindows7の環境ではC:\Windows\Microsoft.NET\F...

今回はフォームを作れるか試してみます。

ソース

using System;
using System.Windows.Forms;

class FormSample {
    [STAThread]
    static void Main() {
        Form form = new Form();
        
        Application.Run(form);
    }
}

テキストエディタに貼り付けて保存します。

コンパイル

powershell.exeから実行

PS H:\csharp\formsample> csc /t:winexe .\ソースファイル.cs

オプションで/t:winexeを追加しています。少しするとコンパイルが終了し前回と同様に.exeファイルが出来上がります。 実行してみるとフォームが表示されました。

ソースファイルが複数の場合

ファイル名:MyForm.cs

using System.Windows.Forms;

public class MyForm : Form {
}

ファイル名:ManySource.cs

using System;
using System.Windows.Forms;

class ManySource {
    [STAThread]
    static void Main() {
        Form form = new MyForm();
        
        Application.Run(form);
    }
}

先のフォームを作成するプログラムを無理やり分割してみました。
MyForm.csはSystem.Windows.Formsを継承したMyFormクラスを定義しています。メソッドやプロパティは一切定義していないので、機能的にはSystem.Windows.Formsと多分同じはずです。
ManySource.csはアプリケーションのエントリーポイントになります。
コンパイル

PS>csc /t:winexe /out:ManySource.exe ManySource.cs MyForm.cs

成功するとManySource.exeが出来上がります。実行すると先程のサンプルと同様に空のフォームが表示されます。

 

MSBuildを使ってビルドする。

ファイル名:ManySource.csproj

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>  
   <AssemblyName>BaseForm</AssemblyName>  
    <OutputPath>Bin\</OutputPath>  
  </PropertyGroup>  
  <ItemGroup>
    <Compile Include="*.cs"/>
  </ItemGroup>
  <Target Name="Build" Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" TargetType="winexe" OutputAssembly="$(OutputPath)$(AssemblyName).exe"/>
  </Target>
  <Target Name="Clean" >  
    <Delete Files="$(OutputPath)$(AssemblyName).exe" />
  </Target>
  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
  <Target Name="Run" DependsOnTargets="Rebuild">
      <Exec Command="$(OutputPath)$(AssemblyName).exe" />
  </Target>
</Project>

MSBuildのチュートリアルを参考にというかほぼそのままですが、プロジェクトファイルを作成しました。
ItemGroupのCompile Includeにワイルドカードで.csを指定することで同一ディレクトリ内の全てのソースファイルを対象にしています。
ちなみにIncludeで指定したワイルドカードから除外したいソースがある場合はExcludeで除外出来ます。

面倒なのでワイルドカードにしていますが、ソースファイルの数分だけCompile Include=”ソースのパス”を記述することでコンパイルするソースファイルを限定することが出来ます。

ソースファイルと同じディレクトリにプロジェクトファイルを保存

ビルド

PS>msbuild /t:build

プロジェクトファイルと同じディレクトリで上記コマンドを実行
binディレクトリを作成しそのディレクトリにManySource.exeを作成

クリーン

PS>msbuild /t:clean

bin\ManySource.exeを削除

リビルド

PS>msbuild /t:rebuild

clean、buildを順番に実行

実行

PS>msbuild /t:run

rebuild後生成されたexeファイルを実行

コメント