読者です 読者をやめる 読者になる 読者になる

SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

.NET Coreことはじめ~その2~

.NET Core C#

前回に引き続き、.NET Coreを使ったプロジェクトの基本を見ていきます。

今回はファイルや依存ライブラリの追加、ビルド時の各種設定などを見ていきます。

ファイルの追加など

.Net Coreのプロジェクトでは、今までのcsprojでのファイル管理とは異なり、project.jsonのあるフォルダ以下のファイルはすべてプロジェクトに含まれた状態となるようです。

そのため、プロジェクトにファイルを追加したい場合は、こんな風に単純にファイルを作成してその中にクラスを書くだけでOKです。
f:id:minami_SC:20161023120947p:plain

こんなファイルを用意しました。

Person.cs

namespace Sample
{
    public class Person
    {
        public string Name { get; set; }

        public int Age { get; set; }

        public Person (string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
    }
}

Program.cs

using System;
using Sample;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var person = new Person("hoge", 20);
            Console.WriteLine($"{person.Name}さん, {person.Age}才");
        }
    }
}

実行結果は以下の通り。
f:id:minami_SC:20161023121224p:plain

ただ、Win10のコマンドプロンプトで実行したら、こんな風に文字化けしてしまいました・・・
f:id:minami_SC:20161023121230p:plain

文字コードの問題とかですかね。。。

依存ライブラリの追加

Json.NETを使い、JSON形式のデータを扱ってみます。

依存するライブラリを追加するには、以下のようにproject.jsonのdependenciesの項目にライブラリとそのバージョンの情報を追記します。

追記したら、dotnet restoreを実行すればOK!!

project.json

{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {
    "Newtonsoft.Json": "9.0.1"
  },
  "frameworks": {
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.1"
        }
      },
      "imports": "dnxcore50"
    }
  }
}

微妙にメンドイですね。。。
npmでのパッケージインストールみたいにできないのかなぁ、と思いGitHubのissuesを眺めていたら、以下のようなページを見つけました。
https://github.com/dotnet/cli/issues/1578

今後のアップデートで、ライブラリをインストールするためのコマンドなども追加されるのかな??

準備ができたら、Program.csを以下のように書き換えて実行してみます。

Program.cs

using System;
using Sample;
using Newtonsoft.Json;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var person = new Person("hoge", 20);
            var json = JsonConvert.SerializeObject(person, Formatting.Indented);
            Console.WriteLine(json);
        }
    }
}

こんな風に、フォーマットされたJSON文字列が出力されます。
f:id:minami_SC:20161023121245p:plain

exeファイルとしてビルドする

最後に、実行可能なexeファイル形式としてビルドをしてみます。

project.jsonのファイルを、以下の手順で編集します。

  1. "type": "platform"と書かれている部分を削除します。
  2. runtimesという項目を追加し、以下のように対象のプラットフォームを書きます。
  "runtimes": {
    "win10-x64": {},
    "osx.10.11-x64": {}
  }

project.json

{
  "version": "1.0.0-*",
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {
    "Newtonsoft.Json": "9.0.1"
  },
  "frameworks": {
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "version": "1.0.1"
        }
      },
      "imports": "dnxcore50"
    }
  },
  "runtimes": {
    "win10-x64": {},
    "osx.10.11-x64": {}
  }
}

project.jsonを編集したら、dotnet restoredotnet buildとコマンドを実行します。

すると、こんな風にexeファイルとして出力されます。
f:id:minami_SC:20161023121253p:plain

別のプラットフォーム用にビルド

先ほどの手順では、「win10-x64」環境向けのファイルだけが作られていました。

runtimesの項目に書いた、別のプラットフォーム向けにビルドするには、 以下のように、-rオプションを付けてビルドします。

dotnet build -r osx.10.11-x64

dotnet publish

先ほどの手順で、dllではなくexeとして実行可能な形式でビルドすることができました。
しかし、この実行ファイルは.NET Coreの各種パッケージに依存した実行ファイルなので、.NET Coreのランタイムがない環境では実行できません。

.NET CoreのランタイムがないPCで実行できるような形式でビルドするには、以下のコマンドを実行します。

dotnet publish

すると、ビルド結果が保存されるディレクトリにpublishというフォルダができます。
この中には実行に必要なライブラリ類とexeファイルがすべて格納された状態となっています。
このフォルダ一式をまとめてコピーすれば、ビルドした環境以外でもexeファイルを実行できる状態となっています。

MacLinuxなどの環境での動作はまだ試せていませんが、 この方法でビルドしたexeファイルを、.NET CoreをインストールしてないWin環境に持っていっても実行することができました。

リリースビルド

リリースビルドする場合は、以下のように-cオプションを加えてビルドします。

dotnet build -c Release

今回はここまで。