.NetとC#に入門する

.NET

はじめに

Modular Monolith with DDDを見ていたら、.NETの方が気になってきてしまい入門した。

.NetとはMicrosoft によって作成された開発者プラットフォームである。

f:id:gkuga:20220410115906p:plain
https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2019/july/csharp-net-reunified-microsoft%E2%80%99s-plans-for-net-5

昔はWindows製品の開発用だったと思うのだが、今ではMacで開発できるし環境構築も一瞬で終わって感動している。

Hello World!

$ brew install --cask dotnet
$ dotnet new console --output sample1
$ dotnet run --project sample1
Hello World!

終わり。dotnet cliが良い感じ。dotnet climsbuildを使ってビルドをしている。

ディレクトリ構成

.dllMacで見るのは不思議な感じだ。

.
├── Program.cs
├── bin
│   └── Debug
│       └── netcoreapp3.1
│           ├── sample1.deps.json
│           ├── sample1.dll
│           ├── sample1.pdb
│           ├── sample1.runtimeconfig.dev.json
│           └── sample1.runtimeconfig.json
├── obj
│   ├── Debug
│   │   └── netcoreapp3.1
│   │       ├── sample1.AssemblyInfo.cs
│   │       ├── sample1.AssemblyInfoInputs.cache
│   │       ├── sample1.assets.cache
│   │       ├── sample1.csproj.CoreCompileInputs.cache
│   │       ├── sample1.csproj.FileListAbsolute.txt
│   │       ├── sample1.csprojAssemblyReference.cache
│   │       ├── sample1.dll
│   │       ├── sample1.genruntimeconfig.cache
│   │       └── sample1.pdb
│   ├── project.assets.json
│   ├── project.nuget.cache
│   ├── sample1.csproj.nuget.dgspec.json
│   ├── sample1.csproj.nuget.g.props
│   └── sample1.csproj.nuget.g.targets
└── sample1.csproj

DLLにはCLR *1 で動くマネージドDLLと環境依存のアンマネージドDLLがある。マネージドの方は仮想マシン上で動く。マルチプラットフォームに対応してしばらく経つが、今後C#でWeb開発もだんだん増えていくのだろうか。

シングルバイナリを生成するには以下。(M1 Macの場合)

$ dotnet publish sample1 --runtime osx-x64

Program.cs

ソースコードの本体。

$ cat Program.cs                                                                                                                                                                                                                                       main 
using System;

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

Web API

dotnetコマンドには様々なプロジェクトのテンプレートがある。Web APIだと次のようになる。

$ dotnet new webapi --output sample2
$ dotnet run --project sample2

このコマンドによりWebアプリケーションフレームワークASP.NETを使ったWeb APIプロジェクトが生成される。生成されたAPIを叩いてみると以下のようになった。

$ curl --insecure -L http://localhost:5000/WeatherForecast
[{"date":"2022-04-11T01:49:20.843834+09:00","temperatureC":45,"temperatureF":112,"summary":"Cool"},{"date":"2022-04-12T01:49:20.843845+09:00","temperatureC":-19,"temperatureF":-2,"summary":"Bracing"},{"date":"2022-04-13T01:49:20.843849+09:00","temperatureC":53,"temperatureF":127,"summary":"Sweltering"},{"date":"2022-04-14T01:49:20.843853+09:00","temperatureC":40,"temperatureF":103,"summary":"Cool"},{"date":"2022-04-15T01:49:20.84386+09:00","temperatureC":39,"temperatureF":102,"summary":"Mild"}]

Program.cs

Program.csだけ載せるが、MVCのコントローラーも生成されている。

$ cat Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace sample2
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

おわりに

基本的にはJavaと同じだと思うが、何か.Netの方が開発体験が良い気がする。Javadotnet cliを作ればいいのかもしれない。

参照

*1:Java VMにあたるもの