Share via


Arm64X バイナリをビルドする

Arm64X バイナリ (Arm64X PE ファイルとも呼ばれます) をビルドすると、x64/Arm64EC プロセスと Arm64 プロセスの両方に 1 つのバイナリを読み込ませることができます。

Visual Studio プロジェクトから Arm64X バイナリをビルドする

Arm64X バイナリのビルドを有効にするために、Arm64EC 構成のプロパティ ページには、新しい [Build Project as ARM64X] プロパティがあります。これは、プロジェクトファイルでは BuildAsX として知られています。

Property page for an Arm64EC configuration showing the Build Project as ARM64X option

ユーザーがプロジェクトをビルドすると、通常、Visual Studio は Arm64EC 用にコンパイルし、出力を Arm64EC バイナリにリンクします。 BuildAsXtrue に設定すると、Visual Studio は代わりに、Arm64EC および Arm64 の両方でコンパイルします。 次に、Arm64EC リンク ステップを使用して、両方を 1 つの Arm64X バイナリにリンクします。 この Arm64X バイナリの出力ディレクトリは、Arm64EC 構成で出力ディレクトリが設定されているものになります。

BuildAsX正常に動作させるには、Arm64EC 構成に加えて、既存の Arm64 構成が必要です。 Arm64 と Arm64EC の構成には、C ランタイムと C++ 標準ライブラリが同じである必要があります (たとえば、両方とも /MT を設定します)。 コンパイルだけでなく、完全なArm64 プロジェクトをビルドするなど、ビルドの非効率性を回避するために、プロジェクトのすべての直接参照と間接参照の BuildAsX が True と設定されている必要があります。

ビルド システムでは、Arm64 構成と Arm64EC 構成の名前が同じであると想定されています。 Arm64 構成と Arm64EC 構成の名前が異なる場合 (たとえば、Debug|ARM64MyDebug|ARM64EC)、vcxproj または Directory.Build.props ファイルを手動で編集すると、Arm64 構成の名前を提供する Arm64EC 構成に ARM64ConfigurationNameForX プロパティを追加できます。

目的の Arm64X バイナリが 2 つの別個のプロジェクト (1 つは Arm64、1 つは Arm64EC) の組み合わせである場合は、Arm64EC プロジェクトの vxcproj を手動で編集して ARM64ProjectForX プロパティを追加すると、Arm64 プロジェクトへのパスを指定できます。 2 つのプロジェクトは同じソリューション内にある必要があります。

Arm64X 純粋フォワーダー DLL の構築

Arm64X 純粋フォワーダー DLL は、種類に応じて API を個別の DLL に転送する小さな Arm64X DLL です。

  • Arm64 API は Arm64 DLL に転送され、
  • x64 API は x64 または Arm64EC DLL に転送されます。

Arm64X 純粋フォワーダーは、すべての Arm64EC と Arm64 コードを含むマージされた Arm64X バイナリの構築に関する課題がある場合でも、Arm64X バイナリを有効活用できます。 Arm64X 純粋フォワーダー DLL の詳細については、「Arm64X PE ファイル」の概要ページを参照してください。

次の手順に従って、Arm64 開発者コマンド プロンプトから Arm64X 純粋フォワーダーをビルドします。 結果として得られる Arm64X 純粋フォワーダーは x64 コールを foo_x64.DLL に呼び出し、Arm64 を foo_arm64.DLL に呼び出します。

  1. リンカーが後で純粋フォワーダーを作成するために使用する空の OBJ ファイルを作成します。 純粋フォワーダーにはコードがないため、これらは空です。 これを行うには、空のファイルを作成します。 次の例では、empty.cpp という名前をファイルに付けます。 空の OBJ ファイルは、cl と Arm64 (empty_arm64.obj) 用と Arm64EC (empty_x64.obj) 用の 1 つを使用して作成されます。

    cl /c /Foempty_arm64.obj empty.cpp
    cl /c /arm64EC /Foempty_x64.obj empty.cpp
    

    「cl : Command line warning D9002 : ignoring unknown option '-arm64EC'」というエラー メッセージが表示された場合、正しくないコンパイラが使用されています。 これを解決するには、[ARM64 開発者コマンド プロンプト] に切り替えます。

  2. x64 と Arm64 に対して DEF ファイルを作成します。 これらのファイルは、DLL のすべての API エクスポートを列挙し、これらの API 呼び出しを満たすことができる DLL の名前をローダーに示します。

    foo_x64.def:

    EXPORTS
        MyAPI1  =  foo_x64.MyAPI1
        MyAPI2  =  foo_x64.MyAPI2
    

    foo_arm64.def:

    EXPORTS
        MyAPI1  =  foo_arm64.MyAPI1
        MyAPI2  =  foo_arm64.MyAPI2
    
  3. その後、link を使用して、x64 と Arm64 の両方に対して LIB インポート ファイルを作成します。

    link /lib /machine:x64 /def:foo_x64.def /out:foo_x64.lib
    link /lib /machine:arm64 /def:foo_arm64.def /out:foo_arm64.lib
    
  4. 空の OBJ をリンクして、フラグ /MACHINE:ARM64X を使用して LIB ファイルをインポートして、Arm6X 純粋フォワーダー DLL を生成します。

    link /dll /noentry /machine:arm64x /defArm64Native:foo_arm64.def /def:foo_x64.def empty_arm64.obj empty_x64.obj /out:foo.dll foo_arm64.lib foo_x64.lib
    

結果の foo.dll は、Arm64 または x64/Arm64EC プロセスのいずれかで読み込まれます。 Arm64 プロセスが foo.dll を読み込むと、オペレーティング システムは所定の場所で foo_arm64.dll を即時に読み込み、foo_arm64.dll が任意の API コールに応答します。