.NET6移行時のトラブルシューティング
.NET6移行時、Next Design に依存せず一般的に対応が必要な事項があります。
ここではNext Design 開発チームが遭遇した問題と解消方法を参考情報として掲載します。
詳細は、Microsoftの公式文献をご確認下さい。
- System.Windows.Formsの名前空間が利用できずエラーとなる
- Reactive Extensionsのインターフェースが存在せずエラーとなる
- 画像が表示されなくなる
- System.Windows.GridLength と null 比較で警告が表示される
System.Windows.Formsの名前空間が利用できずエラーとなる
現象
.NET6 では プロジェクトファイルで UseWindowsForms 属性を true に設定しない場合、 System.Windows.Forms の名前空間が利用できず、エラーとなります。
System.Windows.Forms 名前空間を使用しているコード例:
using System.Windows.Forms;
namespace MyExt
{
/// <summary>
/// エクステンションのエントリポイントです
/// </summary>
public class MyExtEntryPoint : ExtensionBase
{
/// <summary>
/// アクティベート時の処理です。
/// </summary>
protected override void OnActivate()
{
var form = new Form();
}
}
}
解消方法
System.Windows.Forms の名前空間を参照しているプロジェクトファイルにて、UseWindowsForms 属性を true に設定します。設定は、プロジェクトファイル(プロジェクト名.csproj)をVisual Studio、もしくはテキストエディタで編集します。
解消前のプロジェクトファイルの例:
<!--csprojの設定-->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
</PropertyGroup>
</Project>
解消後のプロジェクトファイルの例:
<!--csprojの設定-->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
</Project>
Reactive Extensionsのインターフェースが存在せずエラーとなる
現象
.NET6 に移行すると、Reactive Extensions(以後、Rxと表記)の以下のようなインターフェースが変更されていることにより、 今まで利用していたインターフェースが利用できずエラーとなる場合があります。
IObservable<TEventArgs>.ObserveOnDispatcher()
- エラーメッセージ:現在のコンテキストに 'DispatcherScheduler' という名前は存在しません
DispatcherScheduler
- エラーメッセージ:'IObservable
' に 'ObserveOnDispatcher' の定義が含まれておらず、型 'IObservable ' の最初の引数を受け付けるアクセス可能な拡張メソッド 'ObserveOnDispatcher' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください
- エラーメッセージ:'IObservable
コード例:
m_TargetEventSubscription =
targetObservable.Throttle(EventThrottleSpan, DispatcherScheduler.Current)
.ObserveOnDispatcher(DispatcherPriority)
.SubscribeSafely(m_Handler, HandleEvent);
解消方法
以下のRx公式のプログラムを参考にインターフェースを復元することで解消できます。
- https://github.com/dotnet/reactive/blob/9f2a8090cea4bf931d4ac3ad071f4df147f4df50/Rx.NET/Source/src/System.Reactive/Platforms/Desktop/Concurrency/DispatcherScheduler.cs
- https://github.com/dotnet/reactive/blob/9f2a8090cea4bf931d4ac3ad071f4df147f4df50/Rx.NET/Source/src/System.Reactive/Platforms/Desktop/Linq/DispatcherObservable.cs
画像が表示されなくなる
現象
.NET6 ではプロジェクトファイルのSdk設定が Microsoft.NET.Sdk
、かつ、 UseWPF 属性を true
に設定していない場合、そのプロジェクトに含まれるアイコンを他のプロジェクトから参照しても、アイコンが表示されなくなります。
WPFを使用してビューを実装していないプロジェクト等ではこの属性が true となっていない場合があります。
プロジェクト設定の例:
<!--csprojの設定-->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
</PropertyGroup>
</Project>
解消方法
プロジェクトファイルで UseWPF 属性を true に設定します。設定は、プロジェクトファイル(プロジェクト名.csproj)をVisual Studio、もしくはテキストエディタで編集します。
プロジェクト設定の例:
<!--csprojの設定-->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<UseWPF>
</PropertyGroup>
</Project>
System.Windows.GridLength と null 比較で警告が表示される
現象
.NET6 では System.Windows.GridLength
が null を許容しなくなります。
そのため、 GridLength
型のオブジェクトを null 比較している実装がある場合に警告が表示されます。
コード例:
var length = new GridLength();
if(length == null)
{
// ...
}
警告メッセージ:
型 'GridLength' の値が型 'GridLength?' の 'null' に等しくなることはないので、式の結果は常に 'false' になります
解消方法
GridLength
が null となることがないため、null と比較している不要な実装を削除します。
コード例:
var length = new GridLength();
// ...