[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# でライブラリを作成する。

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# のライブラリを利用する。

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 );
}

■でも、可変引数は使えない

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 パーマリンク