質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

2回答

1147閲覧

フレームワークを変更した際に起きるInvalidCastExceptionを解決したい

SHSSH

総合スコア1

UWP

UWPは、Universal Windows Platformの略。様々なデバイス向けに提供されているアプリケーションを共通のフレームワーク上で動作可能にする仕組みで、Windows10で導入されました。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2023/05/25 03:14

実現したいこと

  • Screen Captureのサンプル(.NET 4.7.2/.NET Standard 2.0)を.NET 6に移行させたい
  • フレームワークを変更した際に起きるInvalidCastExceptionを解決したい

前提

C#/.NET 6で画面キャプチャを行うアプリケーションを作っています。
機能の実現のため、UWPの機能であるWindows.Graphics.Captureを利用したいのですが、
アプリ自体は他の機能の兼ね合いもありWPFで作成しています。
下記URLにMicrosoftのサンプルがあり、これを流用したいと考えました。
https://github.com/microsoft/Windows.UI.Composition-Win32-Samples/tree/master/dotnet/WPF/ScreenCapture
このサンプルは.NET Framework 4.7.2が利用されており、サポート切れであるため.NET 6を利用したく、上記サンプルのプロジェクトを.NET 6から参照し、機能を呼び出すこととしました。
サンプルに含まれていたプロジェクトであるComposition.WindowsRuntimeHelpersとCaptureSampleCoreは.NET Standard 2.0が利用されており、これは.NET 6のプロジェクトから参照できないため、TargetFrameworkを.NET 6(net6.0-windows10.0.22000.0)に変更し、NuGetパッケージのMicrosoft.Windows.SDK.Contractを削除しました。WinRTを利用するためにOSバージョンの記載を付加しています。
ここで、ビルドは正常に行えるのですが、キャプチャを実行しようとした際、Direct3D11CaptureFramePool.CreateにてInvalidCastExceptionが発生しました。

発生している問題・エラーメッセージ

コンパイラはエラーを出さず、実行時に下記の例外が発生します。

System.InvalidCastException: 'Specified cast is not valid.'

該当のソースコード

テストとして、MainWindows.xaml.csより、ボタンがクリックされた際に以下のコードでキャプチャを開始するようにしました。

C#

1 var picker = new GraphicsCapturePicker(); 2 CaptureHelper.SetWindow(picker, hwnd); 3 GraphicsCaptureItem item = await picker.PickSingleItemAsync(); 4 5 if (item != null) 6 { 7 capture = new BasicCapture(device, item); 8 9 capture.StartCapture(); 10 }

CaptureHelper.SetWindowでもInvalidCastExceptionが出たため、サンプルから下記のように変更することで対処できました。

C#

1 public static void SetWindow(this GraphicsCapturePicker picker, IntPtr hwnd) 2 { 3 //キャストせずに直接Initializeを呼び出しに変更 4 //var interop = (IInitializeWithWindow)(object)picker; 5 //interop.Initialize(hwnd); 6 WinRT.Interop.InitializeWithWindow.Initialize(picker, hwnd); 7 }

capture = new BasicCapture(device, item);ではコンストラクタが呼ばれ、その中の下記部分で該当の例外が起きています。

C#

1 framePool = Direct3D11CaptureFramePool.Create( 2 device, 3 DirectXPixelFormat.B8G8R8A8UIntNormalized, 4 2, 5 i.Size); 6

試したこと

同様のコードで.NET Framework 4.7.2のプロジェクトから呼び出すことは問題ないことを確認しました。
.NETのバージョン違いによるキャストの仕様について調べてみましたが、答えにたどり着けていません。
ご存じの方がいらっしゃいましたらご教示いただければと思います。

補足情報(FW/ツールのバージョンなど)

Visual Studio 2022 Version 17.5.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/05/25 23:17 編集

.NET 6 では特定の OS に依存する機能は Visual Studio のテンプレートで作るプロジェクトには含まれてなくて、例えば、Windows OS の GDI+ に依存する System.Drawing 名前空間のグラフィックス機能それです。他にもあると思いますが、そういうことは確認済みですか?
SHSSH

2023/05/25 23:32

コメントありがとうございます。 名前空間などの参照は適宜追加しており、問題ないことは確認しています。
退会済みユーザー

退会済みユーザー

2023/05/26 00:55

> 名前空間などの参照は適宜追加しており、問題ないことは確認しています。 名前空間を using に加えるということを言っているのだと思いますが、それだけではダメなこともあるのは認識されているでしょうか? たとえば、上に書いた System.Drawing 名前空間のグラフィックス機能を利用しようとすると、NuGet パッケージのインストールが必要です。 そんなことは承知の上で、上記コメントは余計なお世話でしたらすみません。
guest

回答2

0

このサンプルは.NET Framework 4.7.2が利用されており、サポート切れであるため

まだサポート範囲内だと思います。

Microsoft .NET Framework - Microsoft Lifecycle | Microsoft Learn
ライフサイクルに関する FAQ - .NET Framework | Microsoft Learn

.NET Framework 4.8.1に上げれば、さらに延命可能でしょう(Windows 12?でどうなるかはわかりませんが)

.NETのバージョン違いによるキャストの仕様について調べてみましたが、答えにたどり着けていません。

わたしは何ひとつわかっていませんが、このあたりを見る限り容易ではなさそうな雰囲気を感じます。

Update samples to net5 · Issue #77 · microsoft/Windows.UI.Composition-Win32-Samples

var compositor = new Compositor(); An exception of type 'System.UnauthorizedAccessException' · Issue #617 · microsoft/CsWinRT

CsWinRT/interop.md at master · microsoft/CsWinRT · GitHub


移植作業をやってる方がいましたが、こちらの手元では動きませんでした...
Windows.UI.Composition-Win32-Samples/dotnet/WPF/ScreenCapture at feature/Add_Net6 · tjdskaqks/Windows.UI.Composition-Win32-Samples · GitHub

投稿2023/05/25 14:13

TN8001

総合スコア9807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHSSH

2023/05/25 23:07

ご回答ありがとうございます。 サポート期限については認識が間違っておりました。 また、移植作業等の情報についてもありがとうございます。 ひとまず置いておいて、.NET Framework 4.8.1での開発を検討するのが早そうですね。
guest

0

自己解決

本質的には解決しておりませんが.NET 4.8利用とすることと、
別手法でのキャプチャ(Win32 API CopyFromScreen関数)でのキャプチャで対応することとし、
本質問は一度クローズさせていただきます。ありがとうございました。

投稿2023/06/23 02:21

SHSSH

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問