しばらく前に以下のような記事が上がってました。
Enhancing Non-packaged Desktop Apps using Windows Runtime Components
特に msix や appx などにパッケージングされてないアプリから Windows Runtime コンポーネントの呼び出しが可能になってます。
試してみよう
ということで試してみたいと思います。
普通の .NET Framework の WPF アプリケーションを作成します。そして、Windows Runtime Component (Universal Windows - C++/CX) のプロジェクトを追加します。そして、WPF アプリケーションから Windows Runtime Component プロジェクトへの参照を追加します。以下のような感じになります。
Class1 に簡単な処理を追加します。名前を受け取って簡単なメッセージを返す処理を追加しました。
#pragma once namespace WindowsRuntimeComponent1 { public ref class Class1 sealed { public: Class1(); Platform::String^ GenerateMessage(Platform::String^ name); }; }
#include "pch.h" #include "Class1.h" using namespace WindowsRuntimeComponent1; using namespace Platform; Class1::Class1() { } Platform::String^ Class1::GenerateMessage(Platform::String^ name) { return "Hello" + name; }
ビルドすると winmd ファイルや dll ファイルが生成されます。プロジェクト参照を追加してるので WPF プロジェクトの出力フォルダーにも関連ファイルが追加されています。
.NET 側から Windows ランタイム コンポーネントを呼ぶには dll も必要なので WPF のプロジェクトのプロパティのビルドイベントのビルド後のイベントとして以下のようなコマンドを追加して dll をコピーするようにしておきます。
copy /Y $(SolutionDir)\$(Configuration)\WindowsRuntimeComponent1\*.dll $(TargetDir)
dll が出力フォルダーにコピーされるようになったので、使う Windows ランタイム コンポーネントをマニフェストに指定します。WPF プロジェクトに app.manifest を追加します。
マニフェストの assembly タグの子として以下のようなタグを追加します。使うクラスが複数ある場合は activatableClass タグを複数追加してください。
<file name="WindowsRuntimeComponent1.dll"> <activatableClass name="WindowsRuntimeComponent1.Class1" threadingModel="both" xmlns="urn:schemas-microsoft-com:winrt.v1" /> </file>
そして、Microsoft.VCRTForwarders.140 という名前の NuGet パッケージを WPF プロジェクトに追加します。2019 年 5 月 13 日時点では、まだプレビューなので NuGet パッケージマネージャーで検索するときはプレビューを含めるにチェックを入れて検索してください。
最後に Any CPU では動かないので x86 か x64 でビルドするようにします。Configuration Manager を開きましょう。ここでは x86 に設定しようと思います。
Active solution platform を x86 にします。この時点では、まだ WPF のプロジェクトが Any CPU になってるので、ここを x86 にしましょう。
これで、WPF プロジェクトから Windows ランタイム コンポーネントが使えるようになりました。早速使ってみましょう。
MainPage.xaml を以下のように編集して…
<Window x:Class="WPFandWinRTComponent.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WPFandWinRTComponent" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <StackPanel> <TextBox x:Name="textBox" /> <Button Content="Button" Click="Button_Click" /> <TextBlock x:Name="textBlock" /> </StackPanel> </Window>
そして、コードビハインドで以下のように Windows ランタイムコンポーネントを使って処理を書きます。
using System.Windows; namespace WPFandWinRTComponent { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { textBlock.Text = new WindowsRuntimeComponent1.Class1().GenerateMessage(textBox.Text); } } }
実行してみましょう。
WPF アプリから Windows ランタイムコンポーネントで作った処理が呼べていることがわかります。
まとめ
UWP でつくらなくても Windows 10 向けに用意されている機能に色々"簡単に"アクセスできるような下回りが揃ってきています。
Windows 7 のサポートが切れると、Windows 10 にかなりフォーカス出来るようになってくるので、ここらへんの機能を使って Windows 10 の機能を色々作ったデスクトップアプリが作っていけるようになると思います。
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.