basyura's blog

あしたになったらほんきだす。

mono で async/await

Mono is a software platform designed to allow developers to easily create cross platform applications. Sponsored by Xamarin, Mono is an open source implementation of Microsoft's .NET Framework based on the ECMA standards for C# and the Common Language Runtime.

Mono

いつのまにか 3 系にアプデートされて C# 5.0 相当になり、async/await が使えるようになってた。

using System;
using System.Threading;
using System.Threading.Tasks;

class Class1 {

  static void Main(string[] args)
  {
    new Class1().Invoke();
    for (int i = 0 ; i <= 5 ; i++)
    {
      Console.WriteLine("●-" + i);
      Thread.Sleep(1);
    }
  }

  public async void Invoke()
  {
    await Hello().ContinueWith(x => Console.WriteLine("   3 - ◯ => " + x.Result));
    Thread.Sleep(1);
    Console.WriteLine("   4 - ◯ ");
  }

  private async Task<bool> Hello()
  {
    bool ret = await new TaskFactory().StartNew(() => {
                 Console.WriteLine("   1 - ◯ ");
               }).ContinueWith(x =>{
                 Console.WriteLine("   2 - ◯ ");
                 return true;
               });
    return ret;
  }
}

コンパイル時のデフォルトは .Net4.0 になっているようなので、4.5 を指定する必要がある。この指定方法が分からずにだいぶハマった・・・。

dmcs -sdk:4.5 TestAcync.cs

実行

$ mono TestAsync.exe

   1 - ◯ 
●-0
   2 - ◯ 
●-1
   3 - ◯ => True
●-2
   4 - ◯ 
●-3
●-4
●-5

無事できましたっと。

vim-quickrun

くいっくるんで実行したい場合の設定。

let g:quickrun_config['cs'] = {
   \   'exec': ['%c -sdk:4.5 %o -out:%s:p:r.exe %s', 'mono %s:p:r.exe %a'],
   \ }

システムデフォルトの設定を変更できる方法があるのかもしれないけどよく分からない。

Xamrin Studio

f:id:basyura:20140112110806p:plain

visual studio なくてもできそう。プロジェクトファイルも visual studio 2012 相当で作るっていう設定もある。試しに開いてみる

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloWorld", "HelloWorld\HelloWorld.csproj", "{18672E83-0FC4-4D27-BB55-E4BDF76A651A}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|x86 = Debug|x86
		Release|x86 = Release|x86
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{18672E83-0FC4-4D27-BB55-E4BDF76A651A}.Debug|x86.ActiveCfg = Debug|x86
		{18672E83-0FC4-4D27-BB55-E4BDF76A651A}.Debug|x86.Build.0 = Debug|x86
		{18672E83-0FC4-4D27-BB55-E4BDF76A651A}.Release|x86.ActiveCfg = Release|x86
		{18672E83-0FC4-4D27-BB55-E4BDF76A651A}.Release|x86.Build.0 = Release|x86
	EndGlobalSection
	GlobalSection(MonoDevelopProperties) = preSolution
		StartupItem = HelloWorld\HelloWorld.csproj
	EndGlobalSection
EndGlobal

その他、.csproj とか AssemblyInfo.cs も見たことある感じ。iOS と Android のプロジェクトも作れるようだからすごいなぁ。
visual studio バカ高いし、Mac や Linux でも動作する環境というのはうれしいなぁ。機能的にはまだまだなのかもしれないけど。
開発するためだけに年間いくらお布施するんだってのが・・・辛い。高い。

OmniSharp

久々に導入してみたけど、sntax エラーは教えてくれるけど、クラス名が違うとかは教えてくれないし、:OmniSharpBuild すると必ず Build Failed って出るし・・・・よくわからないので保留・・・