macでC#を動かすまで
agenda
- 環境作成
- hello world
- test
- async/awaitを使う
環境作成
以下からmono develop(Xamarian Studio)を入れる。 Download - MonoDevelop(http://monodevelop.com/Download)
Xamarian Studioが利用しようとするmonoのパスが固定だったりして起動時にハマるので。 macportsでコンパイルしたmonoを使うならmono developもコンパイルしたほうが楽かも。 そうでなければ、monoもダウンロードしたほうが無難だった。
hello world
File>New>Solution選択してC# Console Project。 名前は"HelloWorld"とでもしておく。
以下のようなコードが自動で挿入される。
using System; namespace HelloWorld { class MainClass { public static void Main (string[] args) { Console.WriteLine ("Hello World!"); } } }
コンパイルはCMD + Enter。
test
以下のページを参考にnugetを使えるようにaddonなど設定 Add NuGet Package Manager And ServiceStack to Xamarin Studio Projects | Varekai http://barambani.wordpress.com/2013/10/07/add-nuget-package-manager-and-servicestack-to-xamarin-studio-projects-2/
NUnit.Runnersを入れる
左のペインのReference(参照)で参照を編集する。 ここで管理されているものが認識対象になるっぽい。
テストの作成
左のペインのHelloWorld(プロジェクト名)のところでControl+クリック。新しいファイルを追加 NUnitのTest Fixtureというskeltonがあるのでコレを使うと楽。
using NUnit.Framework; using System; namespace HelloWorld { [TestFixture ()] public class NUnitTestClass { [Test ()] public void TestCase () { Assert.AreEqual (2, 1 + 1); } } }
大雑把な解説
- TestFixtureというAttirbuteを持っているクラスがテストクラス
- TestというAttributeを持っているクラスがテストメソッド
以下のNunitのQuickStartのページを見れば良い。
NUnit - QuickStart http://www.nunit.org/index.php?p=quickStart&r=2.2.10
テストの実行
ウィンドウメニューのRun(実行)の部分にrun unit test(単体テストを実行)という項目があるのでこれをクリック
async/awaitを使う
以下の様なコードに修正。
using System; using System.Threading.Tasks; namespace HelloWorld { class MainClass { public static void Main (string[] args) { Console.WriteLine ("Hello World!"); var m = new MainClass (); var t = m.RunAsync (); t.Start (); Console.WriteLine ("task: {0}", t); t.Wait (); Console.WriteLine ("result: {0}", t.Result); } public async Task<int> RunAsync () { var i0 = await Task.Run (() => 10 + 10); Console.WriteLine ("i0: {0}", i0); var i1 = await Task.Run (() => 100 + 100); Console.WriteLine ("i1: {0}", i1); return i0 + i1; } } }
output
Hello World! task: System.Threading.Tasks.Task`1[System.Int32] i0: 20 i1: 200 result: 220
- System.Threading.Tasks.TaskをusingしていないとTaskは使えない。 -- Taskを使ったコードのところでCtrol+クリックのfixの項目からusingを自動で挿入してくれる
- .net4.0ではTask.run()が存在していない。 -- コンパイルターゲットを変更する必要がある -- async/awaitも同様
Error CS1993: Cannot find compiler required types for asynchronous functions support. Are you targeting the wrong framework version? (CS1993)
target frameworkが4.0のままのせい。
Xamarin.Mac async and await syntax support - xamarin http://forums.xamarin.com/discussion/11444/xamarin-mac-async-and-await-syntax-support
コンパイルターゲットの変更
- 左のペインのプロジェクト部分をダブルクリック
- Target Frameworkを "Mono / .NET 4.5"に変更
- (defaultは.NET 4.0になっている)
async/awaitについて
非同期の部分を同期で呼び出すときどうすればよいかというのがひとつの課題だったり。
- Consoleアプリケーションの場合はMainでWaitとかしていれば良いのだろうか?
参考:
- Installing Add-ins - MonoDevelop http://monodevelop.com/Documentation/Installing_Add-ins
- NuGet Faq http://docs.nuget.org/docs/start-here/nuget-faq
NUnit - QuickStart http://www.nunit.org/index.php?p=quickStart&r=2.2.10
Async/Await - 非同期プログラミングのベスト プラクティス http://msdn.microsoft.com/ja-jp/magazine/jj991977.aspx
- タスク ベースの非同期パターンの利用 http://msdn.microsoft.com/ja-jp/library/hh873173(v=vs.110).aspx
- タスク ベースの非同期パターンの実装 http://msdn.microsoft.com/ja-jp/library/hh873177(v=vs.110).aspx
async/awaitの前にコレ読んでおくと良い気もした。
- 非同期タスク - タスクを使って非同期プログラミングを簡単に http://msdn.microsoft.com/ja-jp/magazine/ff959203.aspx