かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

C# で何か出来るのか?まとめてみた

追記

2020 年 3 月版を書きました。

qiita.com

本文

C# は好きな言語です。C# 1.0 が 2002 年 4 月に出てからもうすぐ16 年!?になろうとしています。 今でも結構イケてる部類にランキングしてると個人的に思ってる C# ですが何が出来るのか?というのをまとめてみたいと思います。C# をこれから始めようと思っている方や、プログラミングを始めようと思ってるけど何を勉強しようか迷っている方が C# を検討する上での参考になればと思います。

コンソールアプリケーション開発

誰もが一度は書く黒い画面に Hello world の文字列を印字するアプリケーションもコンソールアプリケーションです。C# でももちろん作ることが出来ます。以下のような OS に対応しています。

OS .NET Fw or .NET Core
Windows .NET Framework and .NET Core
macOS .NET Core
Linux .NET Core

.NET Core というものが作られてから(その前には Mono がありましたが、今回の記事では .NET Framework と .NET Core を対象にしたいと思います。Mono は Mono で頑張ってるので凄い)

将来的には .NET Core では npm でインストールできるツールみたいなものもサポートするみたいなので、 .NET Core で開発者向けツールみたいなものを作っておくと将来的には、多くの OS で実行できるコマンドラインツールを開発できるようになるかもしれませんね。

blogs.msdn.microsoft.com

引用
.NET Core will include a new deployment and extensibility mechanism for tools. This new experience is very similar to and was inspired by Node global tools. We are re-using the same syntax and much of the experience.

おすすめ度

  • .NET Frameworkでの開発:勉強用にはいいんじゃないかな
  • .NET Core での開発:ツールをインストールする仕組みが整備されたら化けるかも。真面目なツールは、.NET Core で作っておいてもいいと思う。

デスクトップアプリケーション開発

Windows アプリケーション開発は私好きです。

Windows Forms

C# 1.0 からあるやつです。 出自からして Embarcadero さんの(当時は Borland だったかな)作った Delphi や C++ Builder にあった VCL の影響を色濃く受けたと感じるやつですね。

GUI をデザイナーで手軽にぽとぺたと作ってサクサクっと作れるのは衝撃的でした。

ただ今風の UI を作るのは骨が折れる作業です。例えば Twitter クライアントにあるような以下のようなレイアウトをリスト表示したいとします。

f:id:okazuki:20180206202308p:plain

オーナードローというプログラムコードで座標計算しながらゴリゴリゴリゴリ書いていきます。苦行です。 テキストの折り返しや、画像の表示や添付されてる画像が複数ある場合はどういう風にレイアウトして並べるか?どれくらいの大きさにするか?全て愚直にコードで書いていきます。

辛い。

ということで、過去の資産がある場合以外には個人的には触れなくていいと思います。

WPF (Windows Presentation Foundation)

Windows Forms の後継として登場して流行らなかったテクノロジーです。 流行らなかったといっても、今風の UI を割と簡単に書けて Win32API などに割とカジュアルにアクセスできるうえに Windows 10 の API にも限定的だけどアクセスできるので、Windows アプリケーションを作る上では一番出来ることと、作りやすさのバランスがいいプラットフォームです。

Windows 上で動くデスクトップアプリケーションを作るなら、まず最初に検討してもおかしくないくらいの立ち位置にいます。

でも、ワクワクするような新機能の追加は、ここ最近のアップデートを見ている限り無いでしょう。悲しい。

後で紹介する UWP と異なり .NET Framework さえ入っていれば動くので Windows 7 ~ WIndows 10 まで幅広いプラットフォームで動くデスクトップアプリケーションが作れるのが強みです。

UWP (Universal Windows Platform)

Pure UWP

これは正式なカテゴリではないのですが、個人的にわけて説明します。素の UWP です。 Windows 10 で追加された全ての Windows 10 で動かすことが可能なプラットフォームです。

Windows 10 はパソコン、Suraface Hub、HoloLens、モバイル(モバイルは今後の機能アップはないらしい)、IoT 機器で動くため、いろんなところで動きます。さらに Microsoft ストアに登録すれば世界中の Windows 10 を使用している人に向けて公開できる点が WPF や Windows Forms と異なります。

Windows 10 で動くアプリを作る上で最初の選択肢として考えるといいでしょう。ただ、安全であることが求められるので例えば他のプロセスに介入したりとかいうことが出来ないです。スマートフォンアプリに近い雰囲気ですね。

Desktop Bridge

これは exe 形式のアプリを特定のルールに従って appx などの Microsoft ストアに提出できるような形にパッケージングすることが出来るという、いわゆる UWP だけでは辛いけど既存の exe 形式のアプリでは出来てたようなことをやりたい!ってときに使うテクノロジーです。

C# で作った WPF、 Windows Forms のアプリも当然パッケージング出来ます。結構色々なことが出来て…

  • 単一 exe のアプリは当然いける
  • 1 つのパッケージに複数の exe を入れて相互に起動しあったりプロセス間通信をするようなアプリも作れる
  • 普通の UWP に exe も混ぜ込んで相互に何らかの方法でプロセス間通信をして Pure UWP だけではできないことを実現するようなアプリも出来る。見た目 UWP で裏では exe がいろんなことしてるみたいなやつ。

ただ、完全に何でもできるというわけではなく、いくつか制限事項もあったりするので要注意ですね。

デスクトップ アプリケーションのパッケージ化の準備 (MSIX) - MSIX | Microsoft Docs

おすすめ度

  • Windows Form:触れる必要があるまで触れる必要はないと思います。
  • WPF:Windows 7 以降を対象にするならコレ
  • UWP:Windows 10 以降を対象にするならコレ。
    • Pure UWP:まずはコレ
    • Desktop Bridge:Pure UWP で辛くなってきたらコレ

Web アプリケーション

クラウドが普及したおかげで Web アプリケーションを作って公開するハードルが凄く下がりましたよね。 素晴らしい。ということで、ネイティブアプリじゃなくてもいいなら Web アプリでしょ。

ASP.NET WebForm

C# 1.0 のころからある Web アプリケーションをまるでデスクトップアプリケーションを作るかのような感じで作ろうという野心的な試みの元作られたものです。本当にその通りの出来栄えで素晴らしいのですが、如何せん今の Web の仕組みにどっぷりのっかったアプリを作るような時代には Web っぽさを包み隠したフレームワークは合わなくなってきたんでしょうね。

デスクトップアプリケーションでいうところの Windows Forms のような立ち位置です。

ASP.NET MVC

明言されてないと思うのですが Ruby on Rails あたりで流行った作り方と同じノリで作れるようにしたものだと思ってます。WebForm が HTTP を隠匿していたのに対して MVC はいかに HTTP に対して自然にプログラミング出来るかというように作られてるように感じます。

.NET Framework のフル機能が使えるのですが、基本的に Windows サーバー上でしか動かないという柵はあります。

ASP.NET WebAPI

REST API を作るのにいい感じに作られた。MVC と似ている。似ているが故に同じような名前の API が別名前空間にあったりして同時に使うとちょっとヤヤコシイ印象を受ける。

ASP.NET Core

コンソールアプリケーションのところでも出てきた Core という名前ですね。 .NET Framework でも動くのですが、ここではとりあえずヤヤコシイので無視しておきます。

ASP.NET MVC と WebAPI をがっちゃんこして .NET Core 上で動くように再構築したようなものです。なので、Linux でも動きます。.NET Core は .NET Framework と比べてランタイムがヘビーじゃないので Docker なんかで動かしたい場合にはこちらのほうがいいと思います。

マイクロサービスとかクラウドネイティブだとかいうノリでアプリを作りたければ、これが最初の選択肢になるでしょう。

おすすめ度

  • ASP.NET WebForm:必要に迫られるまで触る必要はないと思う
  • ASP.NET MVC:フルの .NET Framework に縛られた状態で Web アプリを作りたければまずコレ
  • ASP.NET WebAPI:フルの .NET Framework に縛られた状態で WebAPI を作りたければまずコレ
  • ASP.NET Core:今からやるんなら最初に検討してもいい段階に入って来てると思う。

モバイルアプリ開発

ざまりんはいいぞ。

Xamarin

iOS, Android, UWP などの色んなプラットフォームで動くアプリを C# で書けるようにしようという野心的なやつ。凄い。

Xamarin Native

C# でコードを共有化しつつ画面は各プラットフォーム依存の方法で書きましょうというやり方。そのため、既存のスマホアプリの画面は原理的に完璧に再現できるという強さがある。 (サードパーティ画面部品とかがあった場合には、使うの辛かったりしますが、まぁ原理的には同じことが出来ないわけではない)

Xamarin.Forms

画面も XAML っていう WPF や UWP と同じようなマークアップ言語で共通的に書けるようにしようぜっていう野心的なやつ。WPF, UWP, Tizen など iOS や Android いがいにも色んなプラットフォームで動くものが作れるというところが強み。

画面を共通化してしまったが故に最大公約数の機能しかないが、プラットフォームごとにコードを書かないといけないけど、コントロールを書いたりレンダラーと呼ばれるカスタマイズする処理とかを書いたりすれば Xamarin Native よりすご~~~~~く大変だけど、既存のアプリの見た目と同じものは再現できるだろう。

だけど、そこまで見た目に凝るなら画面はプラットフォーム固有の方法で実装したほうがいいよねっていうのが個人的な感想。

まとめ

  • Xamarin:モバイルアプリ開発なら一択でしょう!!
    • Xamarin Native:見た目凝るならこっちのほうが幸せなことが多い
    • Xamarin.Forms:見た目そんなに凝らない(企業向けとか)なら画面までコード共通化できるので強い

ゲームを作りたい

Unity

Unity 社さんの作ってるゲームエンジンで、ちょっと古い C# で書ける。 スマホゲーム界隈で特にあつくて色んなゲームが Unity で作られてる。

DirectX (よく知らないので間違ってるかも)

硬派。よく知らないけど鬼みたいにコード書かないといけない。その代わりまぁ書けばなんでもできるしプリミティブなぶん性能もいいんでしょうね。

おすすめ度

  • Unity:ゲームを C# で書くなら最初に検討するものになると思います。
  • DirectX:Unity 使いましょう。どうしても DirectX が好きなら…?

VR / MR アプリを作りたい

最近流行りの VR やら MR のアプリです。HoloLens や Windows Mixed Reality のヘッドセットあたりで動くアプリが作れます。

Unity

これも Unity で作ります。ただ基盤は UWP なので UWP の知識もあるとなおよし。 これからの世界では、おそらく求められると思うのでここを攻めてみるのもありだと思います。

DirectX

ゲームと同じ。

おすすめ度

  • Unity:最初にこれ
  • DirectX:?

まとめ

ということで、適当につらつらと思いついたものを書いてみました。C# で出来ることと、その中で一番お勧めなものをまとめると以下のようになります。

対象 おすすめ
コンソールアプリケーション .NET Core
デスクトップアプリケーション UWP
Web アプリケーション ASP.NET Core
モバイルアプリ Xamarin
ゲーム Unity
VR / MR Unity

とまぁお勧めのテクノロジだけやってればいいと幸せなのですが C# みたいに歴史のある言語だと過去とのふれあいもどうしても必要になるので、必要に応じてやっていきましょう。