.NET アプリから相互運用機能 API を呼び出す

C# デスクトップ アプリケーション開発者は、.NET では、複数の相互運用関数と Windows ランタイム (WinRT) COM 相互運用性インターフェイスを表す C# 相互運用機能クラスを利用できます。 これには、IWindowNativeIInitializeWithWindowGetWindowIdFromWindow 関数などを表す C# クラスが含まれます。

このトピックでは、使用可能な C# 相互運用機能クラスを一覧表示し、それらの使用方法を示します。 トピックの最後にある「背景」セクションでは、以前のバージョンの .NET での相互運用機能インターフェイスの使用方法と、変更が行われた理由について説明します。

C# 相互運用機能クラスを使用するように .NET デスクトップ プロジェクトを構成する

次のセクション (「使用可能な C# 相互運用機能クラス」) に一覧表示されている C# 相互運用機能クラスは、.NET で、Windows App SDK の一部として、または特定のターゲット フレームワーク モニカー (後ほど説明します) で使用できます。

WinUI 3 C# デスクトップ プロジェクトの場合

Visual Studio で新しい WinUI 3 プロジェクトを作成する (「最初の WinUI 3 プロジェクトを作成する」を参照してください) と、プロジェクトは既に構成されており、すぐにすべての C# 相互運用機能クラスの使用を開始できます。

その他の種類の C# デスクトップ プロジェクト (WPF または WinForms)

Windows Presentation Foundation (WPF)Windows フォーム (WinForms) など、他の種類の .NET デスクトップ プロジェクトの場合は、C# 相互運用機能クラスにアクセスする前にプロジェクトを構成する必要があります。 次に示すクラスの最初のセットでは、Windows App SDK を参照する必要があります。 2 番目のセットでは、次のように Windows 10 バージョン 1809 以降をターゲットとするターゲット フレームワーク モニカーを構成する必要があります。

  1. C# .NET のデスクトップ プロジェクトのプロジェクト ファイルを開きます。

  2. .csproj ファイルで、特定のバージョンの .NET および Windows SDK をターゲットとするように TargetFramework 要素を変更します。 たとえば、次の要素は Windows 10 バージョン 2004 をターゲットとする .NET 6 プロジェクトに適しています。

    <PropertyGroup>
      <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
    </PropertyGroup>
    

サポートされているその他の値の一覧など、詳細については、ターゲット フレームワーク モニカー オプションの使用に関するページを参照してください。

使用可能な C# 相互運用機能クラス

注意

以下のクラスには .NET 6 SDK 以降が必要です。

次に、使用可能な C# 相互運用機能クラスを示します。これらは、基になる相互運用関数または WinRT COM 相互運用機能インターフェイスからマップされたものです。 リストされている各クラスは、基になる相互運用機能 API の関数またはメソッドを実装し、パラメーターと戻り値に対してタイプセーフなラッパーを提供します。 たとえば、Windows.ApplicationModel.DataTransfer.DragDrop.Core.DragDropManagerInterop.GetForWindow には IntPtr ウィンドウ ハンドル (HWND) パラメーターが必要で、CoreDragDropManager オブジェクトを返します。 以下のすべての C# 相互運用機能クラスと関連するメソッドは静的です。

Windows App SDK の一部として使用可能

Microsoft.UI.Win32Interop クラスは、次の表に示す C# 相互運用メソッドを実装します。 コード例については、「アプリ ウィンドウの管理」を参照してください。

相互運用関数 C# 相互運用メソッド
GetDisplayIdFromMonitor (Microsoft.UI) DisplayId Win32Interop.GetDisplayIdFromMonitor(IntPtr hmonitor)
GetIconFromIconId (Microsoft.UI) IntPtr Win32Interop.GetIconFromIconId(IconId iconId)
GetIconIdFromIcon (Microsoft.UI) IconId Win32Interop.GetIconIdFromIcon(IntPtr hicon)
GetMonitorFromDisplayId (Microsoft.UI) IntPtr Win32Interop.GetMonitorFromDisplayId(DisplayId displayId)
GetWindowFromWindowId (Microsoft.UI) IntPtr Win32Interop.GetWindowFromWindowId(WindowId windowId)
GetWindowIdFromWindow (Microsoft.UI) WindowId Win32Interop.GetWindowIdFromWindow(IntPtr hwnd)

ターゲット フレームワーク モニカーを介して使用可能

WinRT COM 相互運用機能インターフェイス C# 相互運用機能クラス
IAccountsSettingsPaneInterop (Windows.UI.ApplicationSettings) AccountsSettingsPaneInterop
IDisplayInformationStaticsInterop TFM net6.0-windows10.0.22621.0 と .NET 6.0.7 で導入されました。

(Windows.Graphics.Display) DisplayInformationInterop
IDragDropManagerInterop (Windows.ApplicationModel.DataTransfer.DragDrop.Core) DragDropManagerInterop
IInitializeWithWindow (WinRT.Interop) InitializeWithWindow
IInputPaneInterop (Windows.UI.ViewManagement) InputPaneInterop
IPlayToManagerInterop (Windows.Media.PlayTo) PlayToManagerInterop
IPrintManagerInterop (Windows.Graphics.Printing) PrintManagerInterop
IRadialControllerConfigurationInterop (Windows.UI.Input) RadialControllerConfigurationInterop
IRadialControllerIndependentInputSourceInterop (Windows.UI.Input.Core) RadialControllerIndependentInputSourceInterop
IRadialControllerInterop (Windows.UI.Input) RadialControllerInterop
ISpatialInteractionManagerInterop (Windows.UI.Input.Spatial) SpatialInteractionManagerInterop
ISystemMediaTransportControlsInterop (Windows.Media) SystemMediaTransportControlsInterop
IUIViewSettingsInterop (Windows.UI.ViewManagement) UIViewSettingsInterop
IUserConsentVerifierInterop (Windows.Security.Credentials.UI) UserConsentVerifierInterop
IWebAuthenticationCoreManagerInterop (Windows.Security.Authentication.Web.Core) WebAuthenticationCoreManagerInterop
IWindowNative WinUI 3 のみ

(WinRT.Interop) WindowNative

WPF と WinForms の代替手段については、「ウィンドウ ハンドルを取得する (HWND)」を参照してください。

コードの例

このコード例では、WinUI 3 アプリケーションで 2 つの C# 相互運用機能クラスを使用する方法を示します (「最初の WinUI 3 プロジェクトを作成する」を参照してください)。 このシナリオ例は、Windows.Storage.Pickers.FolderPicker を示すものです。 ただし、デスクトップ アプリでピッカーを表示する前に、オーナーのウィンドウ ハンドル (HWND) を使用して初期化する必要があります。

  1. IWindowNative WinRT COM 相互運用機能インターフェイスを使用して、ウィンドウ ハンドル (HWND) を取得できます。 また、(前のセクションの表を見ると) そのインターフェイスは WinRT.Interop.WindowNative C# 相互運用機能クラスによって表されています。 ここで、this オブジェクトは、メイン ウィンドウの分離コード ファイルからの Microsoft.UI.Xaml.Window オブジェクトへの参照です。
  2. オーナー ウィンドウで UI の一部を初期化するには、IInitializeWithWindow WinRT COM 相互運用機能インターフェイスを使用します。 また、そのインターフェイスは WinRT.Interop.InitializeWithWindow C# 相互運用機能クラスによって表されています。
private async void myButton_Click(object sender, RoutedEventArgs e)
{
    // Create a folder picker.
    var folderPicker = new Windows.Storage.Pickers.FolderPicker();

    // 1. Retrieve the window handle (HWND) of the current WinUI 3 window.
    var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);

    // 2. Initialize the folder picker with the window handle (HWND).
    WinRT.Interop.InitializeWithWindow.Initialize(folderPicker, hWnd);

    // Use the folder picker as usual.
    folderPicker.FileTypeFilter.Add("*");
    var folder = await folderPicker.PickSingleFolderAsync();
}

ウィンドウ ハンドルを取得する (HWND)」および「CoreWindow に依存する WinRT UI オブジェクトを表示する」も参照してください。

バックグラウンド

以前のバージョンの .NET Framework と .NET Core には、WinRT に関する知識が組み込まれていました。 そのような以前のバージョンでは、ComImport 属性を使用して C# で相互運用機能インターフェイスを直接定義し、投影されたクラスをその相互運用機能インターフェイスに直接キャストできました。

WinRT は Windows 固有のテクノロジであり、.NET の移植性と効率性の目標をサポートするために、C# コンパイラと .NET ランタイムから WinRT プロジェクションのサポートは解除され、C# または WinRT のツールキットに移動されました (「WinRT の組み込みサポートの .NET からの削除」を参照してください)。

ComImport 手法は IUnknown ベースの相互運用機能インターフェイス用に引き続き機能しますが、WinRT との相互運用に使用される IInspectable ベースのインターフェイスには機能しなくなりました。

その代わり、.NET では、このトピックで説明する C# 相互運用機能クラスを使用できます。

トラブルシューティングと既知の問題

現在、C# 相互運用機能クラスに関する既知の問題はありません。 フィードバックを提供したり、その他の問題を報告したりするには、既存の問題にご自分のフィードバックを追加するか、新規の問題を WindowsAppSDK GitHub リポジトリに投稿してください。