Upgrade to Pro — share decks privately, control downloads, hide ads and more …

みんな大好き Boo.Lang を SATSUGAI する方法

Grabacr07
February 24, 2015

みんな大好き Boo.Lang を SATSUGAI する方法

Visual Studio Tools for Unity 勉強会での LT 資料です。
VSTU の機能で、.sln / .csproj の生成処理にフックする方法について。

Grabacr07

February 24, 2015
Tweet

More Decks by Grabacr07

Other Decks in Technology

Transcript

  1. Boo.Langを
    SATSUGAI する方法
    2015/02/24 VSTU 勉強会
    Manato KAMEYA (@Grabacr07)
    みんな大好き

    View full-size slide

  2. Self Introduction
    Work
    亀谷学人 - 株式会社グラニ
    C# + Unity でソーシャルゲーム開発
    Private
    Microsoft MVP for .NET (Visual C#)
    Room metro Tokyo staff
    (Windows クライアント開発 勉強会)
    Twitter: @Grabacr07
    Facebook: manao.kameya
    Blog: http://grabacr.net/
    最先端の C# をフルに活用
    CTO: @neuecc (UniRx 開発者)

    View full-size slide

  3. C# Everywhere
    Windows Desktop
    WinForms, WPF
    Windows 8
    Windows Universal apps
    Mac application
    Xamarin.Mac
    Web application
    ASP
    .NET MVC, ASP
    .NET Web API
    Game
    Unity, Playstation Mobile SDK
    Mobile (iOS, Android, WP)
    MonoTouch, Mono for Android
    Embedded, IoT
    .NET Framework Embedded
    Cloud
    Windows Azure, AWS

    View full-size slide

  4. Boo.Lang の襲来
    Visual Studio の補完機能
    電球アイコンをクリック (もしくは Ctrl + . (dot) でも出るよ!)
    例: using System.Linq; が必要、なので書いてくれる

    View full-size slide

  5. Boo.Lang の襲来
    Visual Studio の補完機能
    “List” と入力して補完すると…?

    View full-size slide

  6. Boo.Lang の襲来
    Visual Studio の補完機能
    “List” と入力して補完すると…?
    本当に必要なのは
    System.Collections.Generic の方
    Boo.Lang が真っ先に出てくる
    ので、Ctrl + . (dot) -> Enter と高速で
    入力すると Boo.Lang.List になってしまう

    View full-size slide

  7. Visual Studio Tools for Unity に対する不満
    Boo.Lang.dll への参照
    ぶっちゃけ必要ない!
    が、VSTU が自動的に追加
    (Visual Studio で削除してもムダ)
    VSTU が生成した .sln or .csproj に不満がある
    なら加工しましょう!

    View full-size slide

  8. Project File Generation
    VSTU の生成処理をフックする
    SyntaxTree.VisualStudio.Unity.Bridge.dll
    VSTU をインポートすると自動的に参照 (Editor project)
    デバッグ実行可能
    もちろん、ブレークポイントで止められます!

    View full-size slide

  9. Project File Generation
    ProjectFilesGenerator class
    ProjectFileGeneration - 生成された .csproj に対するフック
    SolutionFileGeneration - 生成された .sln に対するフック
    ProjectFilesGenerator.ProjectFileGeneration += (string name, string content) =>
    {
    // 中略
    // 煮るなり焼くなりお好きに
    return result;
    };

    View full-size slide

  10. Project File Generation
    ProjectFilesGenerator class
    ProjectFileGeneration - 生成された .csproj に対するフック
    SolutionFileGeneration - 生成された .sln に対するフック
    ProjectFilesGenerator.ProjectFileGeneration += (string name, string content) =>
    {
    // 中略
    // 煮るなり焼くなりお好きに
    return result;
    };
    対象ファイル名
    例: "UnityVS.SampleProject1.CSharp.Editor.csproj"
    生成されたファイルの中身
    .csproj の場合は XML がずらずらと…
    好きに加工して、文字列で返す

    View full-size slide

  11. Boo.Lang への参照を削除
    LINQ to XML を使う
    本題から外れるので特に解説はしません :)
    static string KillBooLang(string filename, string content)
    {
    var document = XDocument.Parse(content);
    document.Root
    .Descendants()
    .Where(x => x.Name.LocalName == "Reference")
    .Where(x => (string)x.Attribute("Include") == "Boo.Lang")
    .Remove();
    return document.Declaration + Environment.NewLine + document.Root;
    }

    View full-size slide

  12. Boo.Lang への参照を削除
    LINQ to XML を使う
    本題から外れるので特に解説はしません :)
    static string KillBooLang(string filename, string content)
    {
    var document = XDocument.Parse(content);
    document.Root
    .Descendants()
    .Where(x => x.Name.LocalName == "Reference")
    .Where(x => (string)x.Attribute("Include") == "Boo.Lang")
    .Remove();
    return document.Declaration + Environment.NewLine + document.Root;
    }










    要は、この行を削除
    すればいいのです

    View full-size slide

  13. Notice
    イベントを購読しているように見える
    特に公式サンプルが…
    http://unityvs.com/documentation/api/project-file-generation/
    Project(Solution)FileGeneration はただのデリゲート
    (まあ文字列返してる時点で気付けという話ではあるけども)
    例えば次の場合 ProjectFilesGenerator.ProjectFileGeneration += Hook1;
    ProjectFilesGenerator.ProjectFileGeneration += Hook2;
    ProjectFilesGenerator.ProjectFileGeneration += Hook3;
    ProjectFilesGenerator.ProjectFileGeneration += Hook4;

    View full-size slide

  14. Notice
    イベントを購読しているように見える
    特に公式サンプルが…
    http://unityvs.com/documentation/api/project-file-generation/
    Project(Solution)FileGeneration はただのデリゲート
    (まあ文字列返してる時点で気付けという話ではあるけども)
    例えば次の場合 ProjectFilesGenerator.ProjectFileGeneration += Hook1;
    ProjectFilesGenerator.ProjectFileGeneration += Hook2;
    ProjectFilesGenerator.ProjectFileGeneration += Hook3;
    ProjectFilesGenerator.ProjectFileGeneration += Hook4;
    有効なのは最後の 1 回だけ
    それ以前の 3 回は、呼び出されはする
    ものの、結果は無視される

    View full-size slide

  15. Conclusion
    Project File Generation
    VSTU による .csproj / .sln 生成処理はフックできる
    LINQ to XML で XML を加工して返してあげよう
    例として Boo.Lang への参照を削除してみた
    T4 Template (.tt file) を取り込んだり、#define 定義したり?
    快適な C# + Visual Studio ライフを!

    View full-size slide