1
1

C# .NET 8.0+Native AOTでコンソールアプリを作成する

Posted at

はじめに

.NET 8.0+Native AOTでWindowsコンソールアプリを作成する方法です。

普段は .NET Framework 4.8.xを使用していますが .NET 8.0+Native AOTを使えば簡単にJIT
不要のコンソールアプリが作成できます。手元の環境はWindows10 x64です。

Native AOT(Ahead-Of-Time)について

Native AOT deployment overview - .NET | Microsoft Learn

Publishing your app as Native AOT produces an app that's self-contained and that has been ahead-of-time (AOT) compiled to native code.

アプリをNative AOTとして公開するとネイティブ コードに事前コンパイルされるため.NET ランタイムのない環境でも実行することができます。

.NET Framework 4.8.xはWindows10/11に既定でインストールされており、追加でランタイムを入れる必要がない一方で、起動が遅いという欠点があります。AOTであればその欠点を補うことができます。

開発環境

Native AOT開発では「C++によるデスクトップ開発」を含むVisual Studio 2022が必要になります。

C++によるデスクトップ開発

Visual Studio Installerで「C++によるデスクトップ開発」にチェックを入れます。コンソールアプリであればVS Code + C#拡張機能を使用したコーディングのほうが軽量でよいと思いますがVisual Studioでコーディングする場合は、「.NET デスクトップ開発」にもチェックを入れます。
vsi1.png

.NET SDK

個別のコンポーネントで .NET SDKにチェックを入れます。SDKにチェックを入れると.NET8.0ランタイムも同時にインストールされます。上記で「.NET デスクトップ開発」にもチェックを入れた場合はその時点でチェックが入りますので本操作は不要です。
vsi2.png

アプリの作成

Native AOT開発のページに"GitHubにサンプルがあります"と書かれているのでそちらを参考にします。

  1. プロジェクトの作成
    コマンド プロンプトで以下のコマンドを実行することでHelloWorldというフォルダが作成され、Program.csとプロジェクトファイルHelloWorld.csprojが作成されます。
    dotnet new console -o HelloWorld --aot
    
    既定では最上位レベルのステートメントが有効です。無効にする場合は、
    dotnet new console -o HelloWorld --use-program-main --aot
    
  2. コードの記述
    Program.csにコードを記述します。デフォルトではHello, World!と表示するコードになっています。
    // See https://aka.ms/new-console-template for more information
    Console.WriteLine("Hello, World!");
    
  3. 公開
    HelloWorldフォルダをコマンド プロンプトで開いて、以下のコマンドを実行すると、.\bin\Release\net8.0\win-x64\publish内にHelloWorld.exeが作成されます。
    dotnet publish
    
  4. 実行
    コマンドプロンプト上でHelloWorld.exeを実行するとHello, World!と表示されます。

補足

.NET 8.0+Native AOTでの開発にあたり

普段は .NET Framework 4.8.xを使用しているため、.NET 8.0+Native AOTで開発する上での覚え書きを記載しておきます。

  • .NET Framework 4.8.xではなく .NET 8.0を使用することでより新しいバージョンのC#で開発することができます。C#のバージョンについてはC# 言語の既定のバージョンC# の歴史を参照。C#については C# 言語リファレンス概要 - A tour of C#を参照。

  • 引数を参照する場合はargs変数を使用します。args[0]は自身のパスではなく引数1個目です。

  • 以下の using ディレクティブが自動的に追加されます。

    • using System;
    • using System.IO;
    • using System.Collections.Generic;
    • using System.Linq;
    • using System.Net.Http;
    • using System.Threading;
    • using System.Threading.Tasks;

    無効にする場合は*csprojファイル(上記の例ではHelloWorld.csproj)を開いて<ImplicitUsings>enable</ImplicitUsings>の箇所を<ImplicitUsings>disable</ImplicitUsings>にします。

  • 自身のパスを取得するためにSystem.Reflection.Assembly.GetExecutingAssembly().Locationを使うとエラーになります。

    //自身のパスを取得
    string appPath = System.Reflection.Assembly.GetExecutingAssembly().Location;//エラー
    string appPath = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;//代替例1
    string appPath = Path.GetFullPath(Environment.GetCommandLineArgs()[0]);//代替例2。コマンドラインで使用する場合、拡張子をつけないで呼び出すとここでも拡張子なしとなる。
    //自身のあるフォルダ
    string appFolder = System.AppContext.BaseDirectory;
    
  • 起動時にコマンドプロンプトを出す必要がない/出したくない場合は*csprojファイルのOutputTypeExeからWinExeに変更します。

    <Project Sdk="Microsoft.NET.Sdk">
    
    <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>net8.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <PublishAot>true</PublishAot>
        <InvariantGlobalization>true</InvariantGlobalization>
    </PropertyGroup>
    
    </Project>
    

    例えば、起動時に自身のパスを表示するだけのプログラムは、

    Program.cs
    using System.Runtime.InteropServices;
    
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    static extern int MessageBoxW(nint hWnd, [MarshalAs(UnmanagedType.LPWStr)] string lpText, [MarshalAs(UnmanagedType.LPWStr)] string lpCaption, uint uType);
    
    string appPath = Path.GetFullPath(Environment.GetCommandLineArgs()[0]);
    MessageBoxW(nint.Zero, appPath, "MyPath", 0);
    

Visual Studio 2022でコーディング

環境設定で「.NET デスクトップ開発」にもチェックを入れVisual Studioでコーディングする場合は、

  1. Visual Studio 2022を起動し、「新しいプロジェクトの作成(N)」を押します。
    vs01.png
  2. 「コンソール アプリ」を選んで次へ。
    vs02.png
  3. プロジェクトの名前と保存場所を設定し次へ。
    vs03.png
  4. フレームワークとして「.NET 8.0」を選択し、「native AOT発行を有効にする」にチェックを入れて「作成」を押します。
    vs04.png
  5. コードを記述します。
  6. プロジェクトを右クリックして「発行」を選択します。発行メニューがない場合は、一度Visual Studio Installerで「.NET デスクトップ開発」のみを選択状態にして変更。その後再度Visual Studio Installerを立ち上げて「C++によるデスクトップ開発」にチェックを入れて変更を実施してみてください。
    vs05.png
  7. フォルダを選択し次へ。
    vs06.png
  8. フォルダを選択し次へ。
    vs07.png
  9. 出力先を設定し「完了」を押します。
    vs08.png
  10. 「閉じる」を押します。
    vs09.png
  11. 「すべての設定を表示」を押します。
    vs10.png
  12. 「配置モード」と「ターゲット ランタイム」を選択して「保存」を押します。
    vs11.png
  13. 「発行」を押します。処理が完了したら、出力先にアプリがあることを確認します。
    vs12.png
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1