共用方式為


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 服務物件。 如果您的應用程式符合特定需求,您可以使用本主題中所討論的兩個程序的其中一個,來與 32 位元 OPOS 服務物件交互操作。

編譯為 32 位為 POS for .NET 應用程式應該所有 OPOS 服務物件相互作用,而且不需要本主題中所述的任何程序。

需求

您的應用程式必須符合下列所有條件,才能使用本主題中所述的程序:

  • 您的應用程式會在 64 位元 Windows 上執行。
  • 您的應用程式會使用 OPOS 服務物件。
  • 參考 POS for .NET 可執行檔會編譯為 Microsoft 中繼語言 (MSIL) ('anycpu' 平台)。
  • 應用程式所參考的所有受控組件也會編譯為 MSIL。

在這些情況下,Common Library Runtime (CLR) 會看到所有受控組件都是 MSIL,因此會選擇以 64 位元進程形式執行受控應用程式。 當 POS for .NET 將 32 位元 OPOS 服務物件載入為同進程 COM 伺服器時,將無法載入,而且您的應用程式看不到裝置。 這是因為 64 位元進程無法將 32 位元 COM 伺服器載入其進程空間。

您可以使用下列兩個方法來解決:

將受控進程編譯為 32 位元進程

您可以將主要可執行檔編譯成以 x86 或任何 anycpu32bitpreferred 平台為目標,強制以 32 位元進程形式執行您的進程。 這會導致受控應用程式以 32 位元執行,並將 OPOS 物件載入為同進程 COM 伺服器。

在命令提示字元中將應用程式編譯為 32 位元

  1. /platform:x86 編譯器選項新增至 C# 編譯器命令,如下列範例所示:

    csc /platform:x86 <filename>.cs

    如需詳細資訊,請參閱 MSDN 上的 /platform (C# 編譯器選項)

在 Visual Studio 2013 中將應用程式編譯為 32 位元

  1. 在 Microsoft Visual Studio 2013 中,開啟您的專案。

  2. 開啟 [建置] 功能表,並選取 [組態管理員]

  3. 在 [組態管理員] 對話方塊的 [平台] 資料行中,按一下資料格展開下拉式功能表,然後選取 [x86]。 如果無法使用 [x86],請選取 [<新增... >],然後選取 [x86] 作為新的平台,然後按一下 [確定]

  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. 如果 COM 物件的 GUID 不存在,請在 HKEY_LOCAL_MACHINE/Software/Classes/AppID 下建立新的金鑰。 您不需要將任何值新增至此金鑰。

或者,您可以使用下列 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"
}

另請參閱

其他資源