[win8] C++/CX から C# が使えるよ、という話

[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なので、これは良しということで。

カテゴリー: C#, C++/CX, windows 8 パーマリンク