次の方法で共有


POS for .NET アプリケーションと 32 ビット OPOS サービス オブジェクトとの互換性 (POS for .NET v1.14 SDK ドキュメント)

OLE for Retail POS (OPOS) サービス オブジェクトは 32 ビット オブジェクトとしてのみ存在するため、特定の状況下では、Microsoft Point of Service for .NET (POS for .NET) アセンブリを参照する 64 ビット アプリケーションは OPOS サービス オブジェクトの読み込みに失敗することがあります。 アプリケーションが一定の要件を満たす場合は、このトピックで説明する 2 つの手順のうちのいずれかを使って、32 ビット OPOS サービス オブジェクトと相互運用できます。

32 ビットとしてコンパイルされた POS for .NET アプリケーションは、すべての OPOS サービス オブジェクトで動作するはずであり、このトピックで説明する手順のいずれも必要ありません。

要件

このトピックで説明する手順を使うには、アプリケーションが次の条件をすべて満たしている必要があります。

  • アプリケーションは 64 ビット Windows 上で動作しています。
  • アプリケーションは OPOS サービス オブジェクトを使っています。
  • POS for .NET を参照する実行可能ファイルは、Microsoft 中間言語 (MSIL)('anycpu' プラットフォーム) としてコンパイルされています。
  • アプリケーションから参照されるすべてのマネージド アセンブリも MSIL としてコンパイルされています。

これらの条件下では、共通言語ランタイム (CLR) はすべてのマネージド アセンブリが MSIL であると認識するため、マネージド アプリケーションを 64 ビット プロセスとして実行することを選びます。 POS for .NET が 32 ビット OPOS サービス オブジェクトをインプロセス COM サーバーとして読み込もうとすると、読み込みに失敗し、デバイスはアプリケーションから見えなくなります。 これは、64 ビット プロセスが 32 ビット COM サーバーをそのプロセス空間に読み込むことができないためです。

この問題は、次の 2 つの解決方法のいずれかを使って回避できます。

マネージド プロセスを 32 ビット プロセスとしてコンパイルする

x86 または anycpu32bitpreferred プラットフォームをターゲットにするメイン実行可能ファイルをコンパイルすることにより、32 ビット プロセスとして実行するようにプロセスに強制的することができます。 その結果、マネージド アプリは 32 ビットとして実行され、OPOS オブジェクトはインプロセス COM サーバーとして読み込まれます。

コマンド プロンプトでアプリケーションを 32 ビットとしてコンパイルするには

  1. 次の例のように、C# コンパイラ コマンドに /platform:x86 コンパイラ オプションを追加します。

    csc /platform:x86 <filename>.cs

    詳細については、MSDN の「/platform (C# コンパイラ オプション)」を参照してください。

Visual Studio 2013 でアプリケーションを 32 ビットとしてコンパイルするには

  1. Microsoft Visual Studio 2013 で、プロジェクトを開きます。

  2. [ビルド] メニューを開き、[Configuration Manager] を選びます。

  3. [Configuration Manager] ダイアログ ボックスで、[プラットフォーム] 列のセルをクリックしてドロップダウン メニューを展開し、[x86] を選びます。 [x86] を使用できない場合は、<[新規作成]> を選び、新しいプラットフォームとして [x86] を選び、[OK] をクリックします。

  4. プロジェクトをリビルドします。

マネージド プロセスを 64 ビット プロセスとしてコンパイルし、OPOS オブジェクトの COM レジストリを変更する

OPOS サービス オブジェクトの COM 登録を変更して、32 ビット ホスト プロセスを使用できます。 その結果、Windows は、64 ビット マネージド プロセスと 32 ビット COM サロゲート ホスト プロセスの間のプロセス間通信 (IPC) とデータのマーシャリングを処理するようになります。

OPOS サービス オブジェクトの COM レジストリを変更するには

  1. レジストリの HKEY_CLASSES_ROOT/Wow6432Node/CLSID の下にある COM オブジェクトの GUID キーを見つけます。

  2. COM オブジェクトの GUID キーを見つけたら、新しい文字列値 (REG_SZ) を追加します。 名前を AppID に設定し、中かっこを含め、データを COM オブジェクトの GUID に設定します。

  3. HKEY_CLASSES_ROOT/Wow6432Node/AppID の下に COM オブジェクト GUID キーと同じ名前の新しいキーを追加します。

  4. 先ほど追加した新しいキーの下に、新しい文字列値 (REG_SZ) を追加します。 名前を DllSurrogate に設定します。 値は空のままにします。

  5. HKEY_LOCAL_MACHINE/Software/Classes/AppID の下に、COM オブジェクトの GUID と同じ名前の新しいキーを作成します (まだ存在しない場合)。 このキーに値を追加する必要はありません。

または、次の Windows PowerShell スクリプトを使って、OPOS 共通コントロール オブジェクト (CCO) のすべてについて、アウト プロセス COM サーバーを使うように COM レジストリを変更することもできます。 このスクリプトを実行すると、すべての OPOS サービス オブジェクトが 64 ビット アプリケーションと相互運用できるようになります。 このスクリプトは、管理者の Windows PowerShell プロンプトから実行する必要があります。

# This Windows PowerShell script modifies the COM registry for all OPOS
# Common Control Objects (CCO) so that they use out of process COM servers.
# This enables OPOS service objects to work with both 32-bit and 64-bit
# POS for .NET applications.

# .Synopsis
# Create-Regkey: This function creates a new key in the registry
function Create-Regkey {
    param(
        [string] $Key
    )

    if (!(test-path -path $Key -pathType container)) {
            New-Item -path $Key -type container | Out-Null
    }
}

# .Synopsis
# Set-RegEntry: This function creates a new registry key in the registry and
# creates a new value in the key.
function Set-RegEntry {
    param(
        [string] $Key,
        [string] $Name,
        [string] $PropertyType,
        $Value
    )

    Create-RegKey -Key $Key
    Remove-ItemProperty -Path $Key -Name $Name -ErrorAction SilentlyContinue
    New-ItemProperty -Path $Key -Name $Name -PropertyType $PropertyType -Value $Value | Out-Null
}

# Iterate through all of the OPOS Common Control Objects, setting registry
# entries and values for each object.

for ($i = 2; $i -lt 38; $i++) {
    $clsid = '{{CCB90{0:D2}2-B81E-11D2-AB74-0040054C3719}}' -f $i

    Set-RegEntry -Key "hklm:\SOFTWARE\Classes\Wow6432Node\CLSID\$clsid" -Name 'AppID' -PropertyType String -Value $clsid
    Set-RegEntry -Key "hklm:\SOFTWARE\Classes\Wow6432Node\AppID\$clsid" -Name 'DllSurrogate' -PropertyType String
    Create-RegKey -Key "hklm:\SOFTWARE\Classes\AppID\$clsid"
}

If you need to revert the COM registry after running the previous script, you can run the following Windows PowerShell script to remove the new COM registry entries:

# This Windows PowerShell script restores the COM registry for all OPOS
# Common Control Objects (CCO) to their original values.

for ($i = 2; $i -lt 38; $i++) {
    $clsid = '{{CCB90{0:D2}2-B81E-11D2-AB74-0040054C3719}}' -f $i

    Remove-ItemProperty -Path "hklm:\SOFTWARE\Classes\Wow6432Node\CLSID\$clsid" -Name 'AppID'
    Remove-Item -Path "hklm:\SOFTWARE\Classes\Wow6432Node\AppID\$clsid"
    Remove-Item -Path "hklm:\SOFTWARE\Classes\AppID\$clsid"
}

参照

その他の参照情報