次の方法で共有


32 ビットの問題のトラブルシューティング

Visual Studio 2022 にアップグレードすると、アプリのデザイン時エクスペリエンスが動作しなくなるという問題が発生する可能性があります。 これは、32 ビット コンポーネントの参照に関連している可能性があります。 Visual Studio 2022 は 64 ビット プロセスであり、基になるテクノロジ (.NET Framework、.NET、COM\ActiveX など) に関係なく、32 ビット コンポーネントを読み込むことはありません。 Visual Studio をアップグレードするまで、32 ビット コンポーネントへの参照があることに気付かない場合があります。 64 ビットまたはターゲット AnyCPU にコンパイルされた参照は引き続き動作します。 参照しているコンポーネントがAnyCPUにコンパイルされ、そのコンポーネントが32ビットのものを偶然参照している場合にも、同じ問題が発生します。

何がそんなに問題ですか

Windows フォーム コードは、デザイン時と実行時の 2 つのモードで実行されます。 実行時には、コンパイルしたモード (32 ビットまたは 64 ビット、.NET Framework、.NET) で実行されます。 デザイン時に、コードは Visual Studio 内で実行されます。これは 64 ビットの .NET Framework プロセスです。 プロジェクト コードがその環境と一致しない場合は、デザイナーで実行できません。 たとえば、プロジェクトが 32 ビットの .NET Framework または 64 ビットの .NET を対象としている場合、Visual Studio の 64 ビット .NET Framework プロセスと一致しません。 それが問題です。Visual Studio の Windows フォーム デザイナーでは、32 ビット コンポーネントまたは .NET コンポーネントを直接インスタンス化することはできません。64 ビットの .NET Framework コンポーネントのみをインスタンス化できます。 これらの統合の問題を解決するために、Windows フォーム チームは、Windows フォーム デザイナーの翻訳レイヤーのように機能する Visual Studio 用 のアウトプロセス デザイナーを作成しました。 アウトプロセス デザイナーは、コードを代表して Visual Studio 64ビットの .NET Framework デザイナーと通信することで、.NET プロジェクトでデザイナーを使用できるようにします。

以前のバージョンの Visual Studio は 32 ビットを対象としていましたが、プロジェクトはおそらく AnyCPU にコンパイルされました。これは、Visual Studio に合わせてデザイン モードの間に 32 ビットを選択します。 32 ビット固有の参照は機能しましたが、64 ビット固有の参照がある場合は、デザイナーで問題が発生した可能性があります。 Visual Studio 2022 では、問題は元に戻されました。 Visual Studio 2022 は、64 ビットでのみ使用できます。 AnyCPUとしてコンパイルされたコンポーネントとライブラリは、32 ビットと 64 ビットの両方で動作し、Visual Studio 2022 64 ビットで実行される問題はありません。 ただし、Visual Studio 2022 にアップグレードした後、プロジェクトが 32 ビット固有のコンポーネントに依存している場合、デザイン時にプロジェクトの実行が失敗する可能性があります。 これは、参照先コンポーネントが AnyCPU用にコンパイルされていても、32 ビット コンポーネントまたは 32 ビット COM\ActiveX ライブラリを直接参照する場合にも当てはまる場合です。

要約すると、32 ビット コンポーネントは、64 ビット アプリである Visual Studio 2022 の Windows フォーム デザイナーでは使用できません。 アウトプロセス デザイナーは、32 ビットと 64 ビットの両方のデザイン時に.NET アプリ用の Windows フォームを支援するために作成されました。 このデザイナーは、32 ビットおよび 64 ビットの .NET Framework コンポーネントの読み込みに役立ちます。

できること

いくつかの設計変更を考慮する必要があります。これは、プロジェクトに役立つ可能性があります。

  • .NET Framework から .NET 8 以降にアップグレードします。

    .NET ではアウトプロセス デザイナーが使用され、32 ビット デザイナーの問題に役立ちます。

  • .NET Framework を使用して、アプリをターゲット AnyCPUに設定します。

    AnyCPUをターゲットにしてPrefer 32-bitを有効にすると、Visual Studio のデザイン時にアプリは 64 ビット以下で実行されますが、実行時には 32 ビットにコンパイルされます。

  • AnyCPUまたは 64 ビット用に 32 ビット コンポーネントを再コンパイルします。

    32 ビット コンポーネントのソース コードにアクセスできる場合は、 AnyCPU または 64 ビット用にコンパイルして、その新しいバージョンを参照してみてください。

  • 64 ビットの代替コンポーネントを検索します。

    他のユーザーが所有するコンポーネントを使用している場合は、64 ビット バージョンが提供されているかどうかを確認し、これを参照します。

  • プロセス外デザイナーを試してみてください。

    最後のオプションは、.NET Framework のアウトプロセス デザイナーを有効にすることです。

プロセス外デザイナー

プロジェクトが .NET を対象とする場合は、既にアウトプロセス デザイナーを使用しています。 ただし、.NET Framework をまだ使用している場合は、アウトプロセス デザイナーを有効にする必要があります。

警告

更新されたアウトプロセスの 32 ビット .NET Framework デザイナーは、同じアーキテクチャの違いにより、古いインプロセス .NET Framework デザイナーと完全に同等にはなりません。 高度にカスタマイズされたコントロール デザイナーには互換性がありません。 サード パーティのカスタム コントロール ライブラリを使用する場合は、プロセス外の .NET Framework デザイナーをサポートするバージョンが提供されているかどうかを確認します。

いくつかの制限のもとで、アウトプロセス デザイナーは、Visual Studio 2022 で32ビットの問題を処理します。

  • .NET Framework では、型解決が改善された利点があります。
  • ActiveX と COM の参照は、.NET Framework と .NET の両方でサポートされています。
  • Visual Studio のインプロセス デザイナーは、32 ビットアセンブリの読み込みエラーを検出し、アウトプロセス デザイナーの有効化を提案できます。

プロセス外デザイナーを使用する

32 ビット参照のサポートには 、Visual Studio 17.9 以降が必要です。 これを有効にするには、次の <PropertyGroup> 設定をプロジェクト ファイルに追加します。

<PropertyGroup>
    <UseWinFormsOutOfProcDesigner>True</UseWinFormsOutOfProcDesigner>
</PropertyGroup>

プロジェクト ファイルを変更した後、プロジェクトを再読み込みします。

32 ビットの問題検出

現在、Visual Studio で 32 ビット参照の読み込みに失敗することが検出されると、Windows フォームのアウトプロセス デザイナーを有効にするように求められます。 有効にすることに同意すると、プロジェクトが更新され、再読み込みされます。

プロセス外デザイナーを有効にするようユーザーに求める Visual Studio のウィンドウの画像。

この検出機能は、Visual Studio メニューの [ツール>Options>Preview 機能で制御されます。

こちらも参照ください