++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

Archive for 9月 2012

‘Roslyn’ September CTP

leave a comment »

Roslynの更新が。(数日前にneueccさんがRoslynの話してたなーと思ったら、これが出たからか。)

いくつかAPIに破壊的変更有。C#/VB共に、対応文法増加。今回からVisual Studio 2012必須(2010未対応)。

以下、Roslynをインストールするとついてくる「Getting Started」ドキュメントの、変更に関する記述の和訳。

CTP2からの変更

CTP2(2012年6月版)から、以下のような変更あり。主要なものは以下のとおり。

Compiler APIs

  • SyntaxTree.ParseCompilationUnitがなくなって、ParseTextとParseFileに
  • SyntaxNode.GetTextとGetFullTextがなくなって、ToStringとToFullStringに
  • 伸縮可能(elastic)なトリビアを表すフラグがSyntaxTriviaからなくなって、SyntaxAnnotationを使って伸縮性を表すように
    • 注釈: トリビア = 空白など、あってもなくてもいいもの。
    • 伸縮可能なトリビア = 長さがどうでもいい(IDEとかのフォーマットで長さが変わってしまっても構わない)という注釈つきトリビア
  • AssemblyNameReference、AssemblyFileReference、AssemblyObjectReferenceを、MetadataReference抽象クラスからの派生クラスに置き換え
  • CompilationObtions.Defaultがなくなったので、CompilationObtionsのコンストラクター利用を
  • 制御フロー解析(control flow analysis)APIが、TextSpanのstart/endポイントの代わりに、リージョンのentry/endポイントを反映するように変更
    • JumpsIntoRegion/JumpsOutOfRegionプロパティがなくなった代わりに、EntryPoints/ExitPointsプロパティ追加

Services APIs/Editors APIs

いくつかのAPIが、Editor ServicesレイヤーからServicesレイヤーに移動。

  • Classification
  • Code Actions
  • Completion
  • Rename

新規対応した言語機能

C#

  • コレクション初期化子
  • externエイリアス
  • 式ツリー
  • 多次元配列
  • Null許容型
  • オブジェクト初期化子
  • Type forwarders
    • 注釈: 別のアセンブリに移動させてしまった型が、元のアセンブリ内にもあるように見せかけるための IL の機能
    • .NET 4.5で、標準ライブラリが大幅リファクタリングされてて、かなりの型が新しいアセンブリに移動されたものの、過去にビルドしたものが問題なく動くのはこの機能のおかげ
  • unsafeコード(固定長バッファーを除く)

VB

  • 配列リテラル
  • コレクション初期化子
  • 外部メソッド定義(Declare)
  • Handles句
  • 遅延バインディング
  • Null許容型
  • オブジェクト初期化子
  • 演算子のオーバーロード
  • ParamArrayパラメーター
  • 部分メソッド
  • Sharedコンストラクター
  • ユーザー定義の型変換
  • Withステートメント
  • XMLリテラル

September CTPでも未対応のもの

VBのインタラクティブ ウィンドウはまだない。

以下の言語機能は未実装。

C#

  • async/await
  • Caller Member Info属性
  • dynamic
  • Embedded Interop Types(no-PIA)
    • 注釈: .NET 4で導入されたCOM相互運用強化機能
    • PIA(COM相互運用のためのラッパー アセンブリ)がなくても動作するように、PIA中で定義された型の一部(プログラム中で利用してるメソッドの部分だけ)をプログラムに埋め込む機能
    • C#の言語機能としてみると、違うアセンブリで定義されていて部分埋め込みな型にもかかわらず、同じGUIDを持っているなら同じ型だと認識する仕組みっぽい
  • マルチ ターゲット
  • 固定長バッファー(unsafe機能の1つ)
  • WinRT対応
  • XMLドキュメント ファイルの生成

VB

  • async/await
  • Caller Member Info属性
  • Embedded Interop Types(no-PIA)
  • イテレーター
  • マルチ ターゲット
  • My名前空間
  • Static locals
  • Stop/Endステートメント
  • Type forwarders
  • 非構造的例外処理(On Error Resume/Gotoステートメント)
  • WinRT対応
  • XMLドキュメント ファイルの生成

Written by ufcpp

2012年9月20日 at 03:54

カテゴリー: .NET

デスクトップ アプリからのWinRT API利用

with 2 comments

Windowsストア アプリでない、通常の(デスクトップ版の).NETアプリからWinRT APIを呼び出す方法。

WinRT利用のために、.NET Framework自体に手が入っているので、.NET 4.5を使うなら、別にWindowsストア アプリでなくたってWinRT APIを呼べるわけですが。それのやり方、というか、Visual Studio上でいろいろ([参照の追加]ダイアログにWinRTコンポーネントの追加ペインを出したり)やるためには、csprojファイルを1行手動で書き換えないといけないというお話。

一部簡単に日本語で説明しようかというのと、元がVBなので、C#でさらっと書いてみたものを出しておこうかと。

WinRT APIとは

WinRTは、Windows 8で導入された新APIセットです。その一部は、XAML UIフレームワーク、つまり、Windowsストア アプリ(旧称、あるいは、通称Metroスタイル アプリ)を作るためのAPIです。そのほかにも、ファイル操作、ストリーム、ビットマップなど、OSのコア機能を提供しています。大部分は、Win32 APIや.NETでも同様のことができます。それでも、いくつかの場面では、(既存のWin32 APIを使うよりも)WinRT APIを使った方がきれいでわかりやすいことがあります。

WinRT APIは、主にWindowsストア アプリを作るためのAPIです。ただし、Windowsストア アプリでは、Win32 APIや、.NETの標準APIの一部分も使えます。

WinRT APIは様々な言語で作れ、様々な言語から使える(cross-languageな)APIです(現在、マイクロソフトがサポートしている言語として、JavaScript、C++、VB、C#、F#があります)。

WinRTコンポーネントは、WinMD(Windows Metadata)という、メタデータ ファイル(ファイル形式的には.NETアセンブリのメタデータと同じ)を持っていて、このファイルを介して、.NETからの利用や、インスペクション ツール(ReflectorやIL Spyのような、いわゆる逆コンパイラーなど)での読み込みができます。

WinRTの仕組みは、いわば、COMの改良/拡張となりますが、旧来のCOMよりも、だいぶ相互運用が楽になっています。

デスクトップ アプリでのWinRTコンポーネントの参照方法

プロジェクト ファイルの編集

プロジェクト ファイル(csproj)に以下の1行を追加します(OSをWindows 8/Windows RTに限定するという意味)。

<TargetPlatformVersion>8.0</TargetPlatformVersion>

場所的には、TargetFrameworkVersionが入ってる辺り。

<PropertyGroup>
<Configuration Condition=” ‘$(Configuration)’ == ” “>Debug</Configuration>
<Platform Condition=” ‘$(Platform)’ == ” “>AnyCPU</Platform>
<ProjectGuid>{DF27C494-9C02-42F8-AD96-CBEBA2D8B47B}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>WinRtConsoleApp</RootNamespace>
<AssemblyName>WinRtConsoleApp</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<TargetPlatformVersion>8.0</TargetPlatformVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>

Visual Studio上で設定できるわけではないので、csprojファイルをメモ帳などで直接編集します。

参照の追加

以下のアセンブリ/WinRTコンポーネントへの参照を追加します。

  • Windows.winmd
    • 標準のWinRT API
    • 場所: \Program Files (x86)\Windows Kits\8.0\References\CommonConfiguration\Neutral\Windows.winmd
  • System.Runtime.WindowsRuntime
    • 相互運用のための.NETアセンブリ
      • WinRTをIAsyncAction/IAsyncOperationを、.NETのTaskクラス化/awaitable化するための拡張メソッド
      • Point, Rect, Size構造体など、WinRT標準の型にマッピングされる型
    • 場所: \Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll

利用例

例えば、以下のような使い方をします。WinRT APIが提供する型はWindows名前空間の下で定義されています。

static void Main(string[] args)

{

    MainAsync().Wait();

}

 

static asyncTask MainAsync()

{

    var files = await Windows.Storage.KnownFolders.PicturesLibrary.GetFilesAsync(

        Windows.Storage.Search.CommonFileQuery.OrderBySearchRank, 0, 10);

 

    var pics = files.Where(f => IsImageFile(f.Name));

 

    foreach (var pic in pics)

    {

        try

        {

            var desc = await GetDescription(pic);

 

            Console.WriteLine(“name: {0}, width: {1}, height: {2}”,

                desc.Name, desc.Width, desc.Height);

        }

        catch

        {

            continue;

        }

    }

}

 

private static async Task<PictureDescription> GetDescription(Windows.Storage.StorageFile pictureFile)

{

    using (var stream = await pictureFile.OpenReadAsync())

    {

        var name = pictureFile.DisplayName;

 

        var decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(stream);

        var width = decoder.OrientedPixelWidth;

        var height = decoder.OrientedPixelHeight;

 

        retur nnewPictureDescription

        {

            Name = name,

            Width = width,

            Height = height,

        };

    }

}

 

static string[] ImageExtensions = new[] { “.bmp”, “.jpg”, “.jpeg”, “.png” };

 

static bool IsImageFile(string filename)

{

    return ImageExtensions.Any(ext => filename.EndsWith(ext));

}

この例では、Pictureライブラリの直下にある画像ファイルの幅と高さを取得しています。

注釈

この説明を見てのとおり、.NET Frameworkというインフラ レベルでは、Windowsストア アプリに限らずデスクトップ アプリでも、WinRT、つまり、cross-languageなコンポーネント作成/利用ができます。

単に、1から作り直すチャンスが今(Windowsストア アプリ)というだけで、WinRTのcross-languageな側面は、今後利用の幅が広がっていくのではないかと、個人的には思っています(ただし、人的リソースにも限りがあるので、まあ、のんびりと)。

ちなみに、WinRTは「COMの改良/拡張」という話もしていますが、これが、Windows 8でしか動かせない理由だったりします。COMのためのインフラにかなり手を入れていて、この辺りがバックポートできないっぽい。

あと、同じWinRTコンポーネントでも、単に上記のような相互運用の仕組みに乗っているだけのもの(デスクトップ側からも利用可能)と、Windowsストア アプリのサンドボックス内での動作を前提にしているもの(デスクトップでの利用不可)があります。ここで例に挙げたようなファイルやビットマップ操作APIは全社(利用可)で、後者(利用不可)は、例えばコントラクトなんかがあります。(ちなみに、デスクトップ上に、Windowsストア アプリのサンドボックスを無理やり作って、Windowsストア アプリ on デスクトップみたいな真似をすることも、やろうと思えばやれるみたいですが。)

Written by ufcpp

2012年9月18日 at 23:23

カテゴリー: 未分類

『僕は悪くない』

leave a comment »

長いこと、「新製品リリース」的なリンク集しか書いてないなぁ、このブログ。

ということで、久々の駄文。

久々に余裕ができたから、というわけではなく、確かに今週ちょっと余裕はできていたものの、なぜか気が付くと溶けてなくなっている余裕。

まあ、タイトルを見れば、最近何にというか、誰の作品にはまってこんな文章書いてるかは明白なんですが。猫かわいいよ猫

○○と××って一緒でしょ?

ええ、例えば、あの会社のあの言語と、あの会社に買われたあの会社のあの言語。

この言葉に関する僕個人の見解は、

同じものを違う人・会社が作ったら、そりゃ地力の差が出るよね。

スーパー戦隊シリーズ、あるいは、金曜ロードショーのルパンみたいなものです。同じ題材を、別の監督で。試金石、登竜門。ああ、あと、水戸黄門か(去年、シリーズ終了しちゃったんでしたっけ?)。

ええ、買われたあの会社に足りなかったのは長期プランと開発リソースです。ぶっちゃけ、お金です。そりゃ、差が出ます。

用途というか、目標というか、まあ、同じですわね。もっとも、会社のミッションが違うから、厳密に同じとはならないだろうけども、かなり近く。

一方で、結果は、ずいぶんと違いますよね。あっちの言語にも値型、ジェネリック(仮想マシン/メタデータ レベルの真の)、高階関数、型推論、データ処理、非同期とか入ればいいのに。

同じという意見もまあ正しければ、違うという意見も同様に正しい。

数学とか役に立たない

僕はいつも言っています。数学は科学を語る言葉だと。

そして、言葉には、役に立たない語彙は生じません。

たとえて言うと、肉食文化圏の言葉に、米と稲の区別は要らない。そして、やっぱり、その区別はない。逆に、肉食文化の国でしか、cow, bull, ox, beef, cattleなんて語彙の必要もなく。

(ちなみに、言語教育の分野では、文化も含めて覚えるべき派と、あくまで日本文化で語らってもいい派もあったはず。牛肉も全部cowと呼んだり、ことあるごとにsorryって言いまくる英語があってもいい。)

「数学が役に立たない」ってのは、そういうことだと思うんですよねぇ。必要な文化を持っていない。文化も含めて学ぶべきかどうかは今は置いておいて。

米食文化を持っていない国の言葉に、「米と稲の区別がなくて不便じゃないの?」とか尋ねる愚かしさ程度に、数学が役に立たないのも仕方がない。

米食を持つ国の言葉に、「英語にないのに、日本語にだけ稲って単語あっても仕方がなくない?」とか尋ねる愚かしさ程度に、数学は役に立つ。

役に立たないという意見もまあ正しければ、役に立つという意見も同様に正しい。

正しい

「どっちも自分が正しいと思っているよ。 戦争なんてそんなもんだよ。」

ドラえもんの言葉でしたっけ?

争う人の言葉って、いつでも、一人称視点。だから、正しさが定まって、別の正しさと争う。

僕みたいな人間は、いつも視点が三人称。一人称で語ってるように書いてても、ほんとは神視点。だから平気で言える、正しいことなんてないって。

一人称視点な人からすると、神視点な人は「まともに取り合ってくれない。上から目線だ」とか「正論で封殺してくる。傲慢だ」とか感じるようですが。

まあ、そんな話を全部台無しにするような言葉で締めましょうか。

どちらも正しいし、どちらも正しくない。それは正しい。

Written by ufcpp

2012年9月15日 at 21:03

カテゴリー: 未分類

“2012”開発ツール ローンチ

leave a comment »

昨日、各種ツール類の一般ローンチだったようで。

MSDN会員向け提供開始は1か月ほど前にあったので、アーリー アダプター的にはそんなに新しいこともないんですが。いくつか新規提供開始したものも。

ついでに、先週の話になりますが、

Written by ufcpp

2012年9月14日 at 15:30

カテゴリー: .NET