次の方法で共有


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

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

このトピックでは、使用可能な C# 相互運用クラスとその使用方法を示します。 トピックの最後の「Background」セクションでは、以前のバージョンの .NET で相互運用インターフェイスがどのように使用されたか、および変更が行われた理由について説明します。

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

次のセクションに示す C# 相互運用クラス (使用可能な C# 相互運用クラス) は、Windows App SDKの一部として、または特定の Target Framework モニカーを使用して、.NET で使用できます。

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 以降を対象とする Target Framework モニカー を構成する必要があります。

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

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

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

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

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

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

基になる相互運用機能または WinRT COM 相互運用インターフェイスからマップされた、使用可能な C# 相互運用クラスを次に示します。 リストされている各クラスは、基になる相互運用 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. ウィンドウ ハンドル (HWND) は、IWindowNative WinRT COM 相互運用インターフェイスを使用して取得できます。 また、そのインターフェイスは、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 リポジトリに新しい問題を提出します。