[win8] c++/cx から c# のライブラリは使えない…と思ったが使える | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/3429
のところで「使えない~」ということを確認したかったのですが、「使えるよ」というのを教えて頂きました。
C# のプロジェクト出力で「WinWD ライブラリ」にすると、C++/CX や Javascript から使えるようになります。公開するクラスは sealed、メソッドの引数や戻り値はネイティブの型のみ(だったと思う)しかダメなので、若干制限はありますが、それなりに使えます。と言いますか、結構使えます。
どういう使い方をするかというと、
- C++/CX では .NET Framework が扱えないので、ライブラリを使ったほうが良い処理は C# でライブラリを作る。
- String 関係のような便利メソッドを持っているクラスを一度、C# 側で処理して C++/CX に戻す
というのが考えらます。先日のパターンで云えば、
- DirectX のようなライブラリは C++/CX で記述する。
- UI 部分は、C# で作成する。
- ライブラリで C++/CX ではややこしい部分は C# で書く
という分け方です。つまりは、C# -> C++/CX -> C# という使い方ができるという訳です。実に便利。
試しに、System.String の Format メソッドを使うパターンを書いてみましょう。
■C# でライブラリを作成する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | namespace CSharpString { public sealed class CsString { /// <summary> /// 可変引数のメソッド /// </summary> /// <param name="fmt"></param> /// <param name="args"></param> /// <returns></returns> [Windows.Foundation.Metadata.DefaultOverload] public static string XFormat( string fmt, params object [] args) { return string .Format(fmt, args); } public static string Format( string fmt) { return fmt; } public static string Format( string fmt, object arg1) { return string .Format(fmt, arg1); } public static string Format( string fmt, object arg1, object arg2) { return string .Format(fmt, arg1, arg2); } } } |
■C++/CX で C# のライブラリを利用する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void UseCSharpStringInCppCx::BlankPage::Button_Click_1(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) { String^ name = L "tomoaki" ; int age = 44; this ->textBox1->Text = CSharpString::CsString::Format( "masuda {0} {1}" , name, age ); } void UseCSharpStringInCppCx::BlankPage::Button_Click_2(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) { String^ o = CSharpString::CsString::Format(L "only masuda" ); textBox1->Text = o ; String^ o1 = CSharpString::CsString::XFormat(L "masuda {0} {1}" , "tomoaki" , 30 ); } |
■でも、可変引数は使えない
1 2 3 4 | public static string XFormat( string fmt, params object [] args) { return string .Format(fmt, args); } |
C# のほうで、可変引数(params object[])を使っているのですが、実は C++/CX では使えません。今回の場合は、String::Format をエミュレートしたかったので(C++/CX では Platform::String なので編集関係のメソッドがない)可変引数が欲しかったのですが、無理みたいですね。公開するメソッドの型が COM に準じるのでこういう風になっているのかもしれません。
でも、まぁ、普段は可変引数なんて使わないわけで、先のC#のメソッドのように、引数を複数指定すればokなので、これは良しということで。