macでC#を動かすまで

agenda

環境作成

以下から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とかしていれば良いのだろうか?

参考:

async/awaitの前にコレ読んでおくと良い気もした。