■
とにかくMS提供のサンプルが難しすぎ。C++は0xも含めネタが多すぎて、相当難しすぎように感じます。
「あまりに難解なものはやがて廃れて忘れ去られる」という言葉を思い出しまた。(昔、OLE2の本の厚さにビックりした方の名言)
C#で作成したWindowsRuntime ComponentをC++側から呼び出すサンプルを作りました。async/awaitのさばき方が難解。
C++で作成したライブラリをC#側から呼び出す方が圧倒的に多いと思いますが、、。
以下が簡単過ぎるサンプル。
/////////////////////////////////////////
// C# WindowsRuntime Componentusing System;
using System.Threading.Tasks;
using System.Net;
using System.IO;using Windows.Foundation;
using System.Runtime.InteropServices.WindowsRuntime;namespace CSRuntime
{
public sealed class MyClient
{
public MyClient() { }
public static string Name(){ return "Namespace is CSRuntime."; }
public string buffer {get;set;}
public IAsyncAction QuerySample()
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/test/inet_test.aspx");
request.Method = "GET";
Task from = request.GetResponseAsync().ContinueWith(t =>
{
HttpWebResponse hwr = (HttpWebResponse)t.Result;
using (StreamReader reader = new StreamReader(hwr.GetResponseStream)))
{
string str = reader.ReadToEnd();
buffer = str;
}
}, TaskContinuationOptions.OnlyOnRanToCompletion);IAsyncAction to = from.AsAsyncAction();
return to;
}
}
/////////////////////////////////////////
// C++のアプリ#include
using namespace concurrency;void Direct2DApp1::DirectXPage::Button_Click_1(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
// String^ nm = CSRuntime::MyClient::Name();CSRuntime::MyClient^ m = ref new CSRuntime::MyClient();
create_task( m->QuerySample()).then([m,this]()
{
String^ query = m->buffer;
TextBlock^ tx1 = (TextBlock^)this->FindName( "tx1" );
tx1->Text = query;});
}
とにかく動いたレベルのサンプルです。