.NETエンジニアのための定期勉強会(Sansan主催)レポート
C#&.NETの進化と、次期版でできること(2014年版)
― Grani×gloops×Sansan 3社合同 アニバーサリー企画 第5回 勉強会[4]―
さまざまなプラットフォーム向けのプログラムを開発できるまでに進化してきたC#。その内容と特徴を、プラットフォームごとにまとめる。また今後のC#/.NETがどのように進化するかも紹介する。
.NETの最新技術を紹介する「.NET勉強会」が、8月末にGrani×gloops×Sansan 3社合同で開催されました。本稿では、そのセッション内容を詳しく紹介します。勉強会では、下記の4つのセッションがありました。
- 1ASP.NET Identity とそのセキュリティ
- 2ローテクで .NET 技術トレンドの変化に立ち向かう!!
- 3Life with Roslyn ~30分間で分かったツモリになる Compiler as a Service
- 4[本稿]2014年版 C#でできること
本稿では、4の株式会社グラニの田中孝佳による「2014年版C#でできること」のセッション内容をご紹介します。本レポートは、話した内容をそのまま書き起こした形式となります。
Sansan主催の「.NET勉強会」について
Sansan株式会社は、スキルアップを目指す.NETエンジニアのための勉強会を定期的に開催しています。本稿は、アニバーサリー企画としてGrani×gloops×Sansanの3社合同で開催された第5回(開催:2014年8月30日、モデレーター:Sansan株式会社 藤倉成太)の内容をレポートしたものです。第5回では、株式会社グラニより田中孝佳氏、株式会社gloopsより山本昭宏氏をゲストに迎え、Sansan株式会社の渋木宏明、熊家賢治とともに、.NETの最新技術や活用状況に関するセッションを行いました。
2014年版C#でできること ― 株式会社グラニ 田中 孝佳
C#は、もはやWindows OSだけの開発言語ではありません。また、マイクロソフトのサービスとだけ連携するわけではありません。本セッションでは、C#がさまざまなプラットフォームでの開発に利用できること、今後、C#がどのように進化していくかについて説明します。
C#を使おう!
C# 1.0は、2002年にJavaやDelphiの影響を受けた形で作られました。その後、主にC# 2.0でGenerics(ジェネリック/ジェネリクス)、C# 3.0でLINQ、C# 4.0でdynamic
キーワード、C# 5.0でasync
キーワードなどが導入され、進化してきました(図1)。
恐らくC# 6.0では、“Roslyn”が導入されると思われます。
――C#での開発が可能なプラットフォーム
C#による開発は、さまざまなプラットフォームで行われています。以下は、その主要な開発の例です。
- Windowsアプリケーション: Windowsフォーム、WPF
- Windowsプラットフォーム: ユニバーサルアプリ(主にWindows Phone&Windowsストアアプリ)
- Webアプリケーション: ASP.NET MVC/Web API、Webフォーム、OWIN
- クラウド: Microsoft Azure、AWS、Google Cloud Platform
- Mac: Xamarin.Mac/MonoMac
- ゲーム: Unity、PlayStation Mobile SDK、Paradox Game Engine
- モバイル: Xamarin.iOS、Xamarin.Android
- 組込み: Windows Embedded、.NET Micro Framework
- NUI(ナチュラル・ユーザーインターフェース): Kinect、Leap Motion
- Office: VSTO(Visual Studio Tools for Office)
――C#のこれから
開発者向けカンファレンス「Build 2014」の「The Future of C#」というセッションで、「Innovation in .NET ecosystem」(図2)が提示されました。
ベースとなるCore .NETでは、ランタイムにRyuJITという新しいJITコンパイラーが導入され、コンパイラーは“Roslyn”で刷新されます。
AzureやWindows Server、Windowsデスクトップ、Windowsストア、Windows以外にもiOS/Androidなどのプラットフォーム上での開発にも、.NETが活用できるようになっていっています。
また、.NET Foundationという独立フォーラムによるオープンソース化の方針も明らかにされています。
Windowsアプリケーション: Windowsフォーム、WPF
――WindowsフォームからWPFへ
Windowsアプリケーションは、WindowsフォームからWPFへと変化してきました。
その理由として、Windows Vista以降はOSレベルでGPUが活用できるようになったこと、それ以前のGDI(Graphics Device Interface)から脱却しようという動きがあったことなどが挙げられます。
さらに、WPFでは柔軟なレイアウトシステムが構築可能であり、UI定義をXAMLで行い、C#のコードから分離できることも、その変化を後押ししました。
――時代は高DPI対応へ
WindowsアプリケーションはどんどんWPFへと変化してきましたが、今後は高DPI対応が進むと思われます。今4K液晶が話題になっていますが、これが当たり前のようにユーザーの手に渡る時代も近いのではないでしょうか。
高DPI対応については、Windowsフォームでは、基本的にアプリケーション側が全て対応しなければなりません。WPFでは基本的に対応済みですが、マルチディスプレイ環境でモニターごとにDPIが違う場合には、アプリケーション側でちょっとした対応が必要です。
参考までに、Windowsストアアプリはスケーリングにも対応しています。技術が新しいほど、高DPI環境にも対応しているという状況です
Windowsプラットフォーム: ユニバーサルアプリ
――ユニバーサルアプリの登場
異なるプラットフォームで動作するようにしたアプリをユニバーサルアプリと言います(※ちなみにiOSのiPhoneとiPadの両方で動くアプリもユニバーサルアプリと呼ばれますが、これに近い概念です)。Windowsプラットフォームでは、WindowsストアとWindows Phoneの両方で動作するアプリがユニバーサルアプリになります(これを指してユニバーサルWindowsアプリとも呼ばれています)。ただし、日本ではユニバーサルアプリに対応するWindows Phone 8デバイスはない状態です。将来的には、ここにXboxアプリが入る可能性があります。
ユニバーサルアプリでは、WindowsアプリとWindows Phoneアプリにおいて、XAML定義ファイルによるUIの統一とWindows Runtimeの統一を行おうとしています。どちらについてもある程度は統一が進んでいる状態です。Windows Runtimeについては、APIの9割が共通化しています。
ただし、ユニバーサルアプリについては課題もあります。
ストアの共通化は現在進行中です。現状では、開発者の申請はWindowsアプリとWindows Phoneアプリのそれぞれのデベロッパーセンターに行います。また、ユーザーがアクセスするストアも異なります。
開発に関して、プラットフォーム固有のUIの書き方も課題になっています。そもそもWindowsアプリとWindows PhoneアプリではUIや機能で異なる部分があります。アプリ側でこのように固有のUIやスタイルをどのように書けばよいのでしょうか。同様に、例えばWindows Phoneアプリにしかない「電話をかける」といった固有のロジックをどのように書き分けるかといった実践的な問題への対応はまだ確立しているとは言えません。
――多解像度への対応
デスクトップやタブレットなどWindowsデバイスの画面サイズはさまざまです。Windows Phoneにも大きな画面のものと小さな画面のものがあります。
このように画面サイズが異なる場合でも、UIは全て同じでよいかという問題があります。
恐らく、同じUIではよくないケースが多いでしょう。UIを統一しても使い勝手が悪くなると思われます。
では、WindowsアプリとWindows PhoneアプリでUIを切り分ければよいかというと、それも恐らく違います。前述の通り、Windowsアプリは大きな画面のデスクトップで使う場面もあれば、小さな画面のタブレットで使う場面もあるからです。
このようにサイズの異なる画面に対応するには、解像度ごとにXAMLの定義を切り分ける方法がよいと言われていますが、現在進行中の話題として捉えてください。
Webアプリケーション
――数年おきの大変革
Webアプリケーションについても数年おきに変革が起きてきました(図3)。
2002~2003年のASP.NET Webフォーム 1.0に始まり、2005~2008年のASP.NET Webフォーム 2.0、2009年のASP.NET MVC(以下、MVC)と変更されてきました。
時期は未定ですが、ASP.NET vNextが大きな変革になるかどうかは実際にリリースされないと分かりません。しかし、現在公開されている内容から大きな変革になるのではないかと思っています。
――WebフォームからMVCへ
Webアプリケーションでは、WebフォームからMVCへという流れがありました。
Webフォームでは、イベント駆動型のプログラミングが可能です。もともとはWindowsフォームやVisual Basicなどのクライアント向けの開発手法で、GUIでUI要素をドラッグ&ドロップし、要素をダブルクリックしてイベントハンドラーを作ってロジックを書くという手順になります。
しかし、そもそもクライアントとWebでは仕組みが異なるため、Webフォームでは限界があり、C#のRazor構文を使ってHTMLベースでUI開発を行うMVCに移行してきました。
MVCでは、Model-View-Controllerデザインパターンを使います。また、当時、はやっていたRuby on Railsにインスパイアされて取り込んだ機能も数多くあります。
このように大きな変革がありましたが、System.Web
名前空間などのASP.NETのコアの部分については、拡張や改善が行われてきたものの、10年来引き継がれてきました。その間に肥大化が進んだSystem.Web
から脱却することが、ASP.NET vNextの目的の1つです。
――ASP.NET vNextの特徴
ASP.NET vNextには次のような特徴があります。
- モジュラー設計: 全てのライブラリをNuGetで容易に配布可能
- .NET Foundation: オープンソース化
- コンパイル不要の開発と配置: “Roslyn”の活用
- Windows/Mac/Linux上での実行: MonoプロジェクトによるASP.NETのサポート
- サイド・バイ・サイド実行: 1つのWindows Serverで複数のバージョンのASP.NET Webサイトの同時実行(グローバルアセンブリにあるASP.NETのコアライブラリを実行するのではなく、WebサイトごとにASP.NETライブラリを展開する)
- DI(=依存性の注入)の標準サポート
- 高速化、低メモリ使用量、パフォーマンスの改善
- クラウドへの最適化
クラウド
3つのクラウドを、「.NETから利用する」視点と「.NETを動かす」視点から見てみましょう。
――Microsoft Azure
.NETから利用する場合、Azure SDK for .NETにより、.NETからAzureの全ての機能を実行でき、自動化も容易です。また、Visual Studioからの操作も可能で、Visual Studioで作成したプロジェクトを簡単にAzureにデプロイできます。
.NETを動かす環境として考えると、仮想マシンはWindows Serverをほぼそのまま利用できます。それに加え、Azure WebサイトというPaaS(Platform as a Service)で動かすことができます。これは個人的にお気に入りのサービスでもありまして、Azure Webサイトにより、非常に手軽にクラウド上にアプリを作って公開できます。
Azureのメリットとして、Azure Webサイトにより気軽にASP.NETアプリを展開できることが挙げられるでしょう。また、.NETやVisual Studioの新しいバージョンのプレビュー版がいち早くAzureに公開され、MSDNライセンスが必要なものがあるものの、すぐに利用できることもメリットの1つです。
――AWS(Amazon Web Services)
.NETから利用する場合、AWS SDK for .NETがあり、自動化も可能です。意外に知られていませんが、Visual Studio拡張があり、Web上のAWSの管理コンソールと同じ機能をVisual Studioからも操作できます。
.NETを動かす環境としては、Elastic BeanstalkというPaaSがありますが、仮想マシンであるAmazon EC2を利用することが多いです。
AWSは、.NETが動く環境としてはオンプレミスのWindows Serverと変わりません。それ以外のクラウドサービスが強力であり、クラウドの重要な選択肢として取り上げられます。
――Google Cloud Platform/Google Compute Engine
.NETから利用する場合、Google Client Library for .NETにより、Gmailをはじめとする豊富なサービスの多くを.NETクライアントから操作できます。例えば、Gmailのメールの読み込み、Googleカレンダーのデータの取得や予定の挿入といった処理をC#のライブラリを使って実行できます。Google BigQueryも、.NETから利用できます。
.NETを動かす環境としては、Google Compute Engineはプレビュー版としてWindows Server 2008 R2に対応しているだけで、最新版には対応していません。
Google Cloud Platformは、.NETを動かす環境というより、.NETから他にはない特徴的なサービスを数多く利用できるという点で、注目すべきクラウドと言えます。
Mac/Linux
――Monoプロジェクト
MacやLinuxで.NETを動かす選択肢の1つとして、Monoプロジェクトが挙げられます。Monoプロジェクトは、Mac/Linux/Windowsで動く.NET Frameworkの実装で、オープンソース化されています。Xamarinがスポンサーを務めており、ECMA標準のC#を実装しています。
Monoプロジェクトは、ランタイム、コンパイラー、クラスライブラリから構成されます。
.NET Frameworkはバージョン3.5以降オープンソース化が進んでいます。それに伴い、.NET Frameworkのソースコードを利用して取り込めるようになったことから、Monoの進化もだんだん速くなっています。
――Xamarin
マイクロソフトと提携し、クロスプラットフォームでC#アプリを展開するためのツールやクラスライブラリを提供しています。
MonoプロジェクトがXamarin Platformになったわけではなく、別に独立して存在するMonoをXamarin Platformが利用しているという関係です。現時点では、Xamarin.Mac、Xamarin.iOS、Xamarin.Androidがあります。Xamarin StudioというIDEもありますが、Visual Studio拡張での開発も可能です。
ゲーム
――Unity
Unityは、マルチプラットフォームのゲームエンジンです。Web、iOS(Mac/iPhone)、Android、ユニバーサルアプリの他、Xbox、Wii U、PlayStation(これらは特別なライセンスが必要)などをサポートしています。C#での開発が可能で、C#以外の言語にも対応しています。
Unityでは、Monoのバージョンが古く、さらにiOS側にいろいろな問題があることから、WebやWindowsの開発とは同じようにはいきません。WebやWindowsでC#を開発してきた経験があっても、UnityでのC#による開発はスムーズにはいかないことが多々あります。
一方で、LINQやRxといったC#の強力な機能を利用できます。
――UnityもVisual Studioで!
Unityには専用のIDEがありますが、Visual Studio Tools for Unity(旧称:UnityVS)によりVisual Studioでも開発できます。Visual Studio Tools for Unityは、マイクロソフトが開発元を買収したため、無償で提供されるようになりました。
UnityのデフォルトのIDEであるMonoDevelopは、Visual Studioと比べるとコード補完やデバッグ機能が貧弱です。Visual Studio Tools for Unityを利用すると、Visual StudioとMonoDevelopの両方を起動した状態で、Visual StudioからUnityに接続し、Unityで実行してVisual Studioでデバッグするという操作が可能になります。
NUI(Natural User Interface)
――NUIとは
NUIは、人間の自然な動きをコンピューターの入力として利用するための技術分野です。同時に動く複数の人間の動きをセンサリングするセンサー技術や、人間のさまざまな動きを入力パターンとして解釈する機械学習技術など、高度な技術を結集して作られています。
――Kinect v2
Kinect v2は、マイクロソフトが出しているKinectの最新バージョンです。次のような機能を持つアプリをC#で開発できます。
- RGBの解像度をアップ
- 広角レンズによる狭い部屋や短い距離での撮影
- Depthセンサーの向上
- アクティブIRライト
- 関節トラッキングの関節数の増加、向きの確認
- 同時6人の全身トラッキング
- Windowsアプリ、Unityにも対応
Office
――VSTO(Visual Studio Tools for Office)
VSTOを利用することで、クライアント版のOfficeのアドインを開発できます。また、VBAアプリの置き換え先としても利用可能です。例えば、クライアント版のOfficeを会社で使っており、必要な機能をアドインとして開発して展開したい場合に活用できます。
最近、クライアント版OfficeやOffice 365に機能を追加できる「Office用アプリ」が利用されています。Office用アプリはHTML+JavaScriptで作られるもので、C#では開発できないことに注意してください。
運用領域でのC#の活用
――PowerShell Cmdlets Binary Module
PowerShellでは、独自に関数をコマンドレットとして作成し、公開できます。PowerShell Cmdlets Binary Moduleを使えば、PowerShellコマンドレットをC#で実装できます。
PowerShellはスクリプト言語であるため、PowerShellで作成したコマンドレットは速度が遅いこともあります。C#を使うことで、実行速度を向上できるほか、例外処理などC#の強力な言語機能も利用できます。
PowerShell Cmdlets Binary Moduleの実体はクラスライブラリ(DLL)です。C#でPowerShellが提供するDLLを参照し、Cmdlet
クラスを継承してコマンドレットを作成できます。
非常に便利な機能なので、実際に弊社でもいろいろと使っていますが、はまりどころが多く、設定ファイルに関連する問題が発生したり、そもそも情報が少ないといった課題があります。
――コマンドをDLL参照してC#から実行
MSDeployは、Webアプリやファイルの転送に使うコマンドです。通常はコマンドラインでオプションを指定して実行しますが、プログラムからDLLを参照し、APIを利用してデプロイを実行できます。
APIでは指定可能なオプションや引数、実行結果を示す戻り値などの型が決められているので、プログラムから利用しやすいというメリットがあります。また、APIを実行するメソッドに対してtry
/catch
による例外処理を実行できるため、コマンドラインでの実行時に、エラー情報を得にくいという問題を解決できます。
例えば、WPFアプリからWebアプリをデプロイするような仕組みを作りたい場合に活用できます。
まとめ
C#はMicrosoftプラットフォームだけのものではありません。
クラウドサービスのクライアント、Xamarinによるクロスプラットフォーム、Unityによるゲーム分野、Mac/Linux(ASP.NET vNext)においてもサポートされています。
また、Microsoftプラットフォームでも、PowerShellコマンドレットやDLL参照などの運用分野、NUIという新しい分野など、活躍の範囲はどんどん広がっています。
参考リソース
本セッションの参考にしたリソースを紹介します。
- 「XAMLとは何か」
- 「Visual Studio 2012のような光るウィンドウを作る(再)、そしてWPFでの高DPI対応」
- 「ユニバーサルWindowsアプリ開発―概要と典型的な課題への向き合い方」
- 「Webフォーム vs. MVC」
- 「ASP.NETやTypeScriptなど、6月-7月のセッション資料まとめをしてみたり…」
- 「Xamarinの基盤となっている「Mono」と、C#コンパイラ「mcs」」
- 「Visual Studio Tools for Unity 1.9 が公開されました!」
- 「UniRx - Reactive Extensions for Unity」
- 「CLR/H in Tokyo 1で「C#で作るPowerShell Cmdletsのすゝめ」というLTをしてきました」
- 「MSDeployをAPIとして、C#のコードから実行する」
■
最後に、繰り返しになりますが、Sansanでは定期的に.NET勉強会を開催しております。ぜひご参加ください。
※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
1. .NET最新技術「ASP.NET Identity」とは?
ASP.NETの資格管理技術がどう進化して、最新のASP.NET Identityが生まれたのか紹介。また、その特徴と機能、構成、処理の流れなどを解説する。
2. 10分間で人に説明できるまで分かるCompiler as a Service“Roslyn”
Visual Studio “14”の新機能として搭載予定の次期コンパイラープラットフォーム“Roslyn”について、簡単に話せるレベルになるまで、ほんの少しだけ踏み込んで解説。
3. 【現在、表示中】≫ C#&.NETの進化と、次期版でできること(2014年版)
さまざまなプラットフォーム向けのプログラムを開発できるまでに進化してきたC#。その内容と特徴を、プラットフォームごとにまとめる。また今後のC#/.NETがどのように進化するかも紹介する。
4. 破壊的に進化する.NET技術のトレンド変化に立ち向かう
数年で根本から大きく変更される.NET技術。そんなトレンド変化に追随するにはどうすればよいのか? gloopsで実践されている手法を具体的に説明する。
5. Xamarinで今日から始めるクロスプラットフォーム開発
クロスプラットフォームアプリ開発の戦略についてまとめ、Xamarinによるアプリ開発の特徴を説明する。また、Xamarinに関する情報収集や、Xamarin.Forms×MVVMによる開発のポイントを紹介する。