C# デスクトップ アプリケーション開発者は、.NET で、複数の相互運用性関数と Windows ランタイム (WinRT) COM 相互運用性インターフェイスを表す C# 相互運用クラスを使用できます。 これには、IWindowNative
このトピックでは、使用可能な 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)
C# .NET デスクトップ プロジェクトのプロジェクト ファイルを開きます。
.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
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 プロジェクトの作成
- ウィンドウ ハンドル (HWND) は、IWindowNative WinRT COM 相互運用インターフェイスを使用して取得できます。 また、そのインターフェイスは、WinRT.Interop.WindowNative C# 相互運用クラスによって表されます (前のセクションの表を参照)。 ここでは、
this
オブジェクトは、メイン ウィンドウ分離コード ファイルから Microsoft.UI.Xaml.Window オブジェクトへの参照です。 - 所有者ウィンドウで 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();
}
バックグラウンド
以前のバージョンの .NET Framework と .NET Core には、WinRT に関する知識が組み込まれています。 以前のバージョンでは、ComImport 属性を使用して C# で相互運用インターフェイスを直接定義し、投影されたクラスをその相互運用インターフェイスに直接キャストできます。
WinRT は Windows 固有のテクノロジであるため、.NET の移植性と効率性の目標をサポートするため、C# コンパイラと .NET ランタイムから WinRT プロジェクション のサポートを解除し、それを
そのため、.NET では、このトピックで説明する C# 相互運用クラスを使用できます。
トラブルシューティングと既知の問題
現在、C# 相互運用クラスに関する既知の問題はありません。 フィードバックを提供したり、他の問題を報告したりするには、既存の問題にフィードバックを追加するか、WindowsAppSDK GitHub リポジトリに新しい問題を提出します。
関連トピック
Windows developer