Sdílet prostřednictvím


POS for .NET Application Compatibility with 32-bit OPOS Service Objects (POS for .NET v1.14 SDK Documentation)

Vzhledem k tomu, že objekty služby OLE pro prodejní pos (OPOS) existují pouze jako 32bitové objekty, za určitých okolností 64bitové aplikace, které odkazují na bod služby Microsoft Point of Service pro sestavení .NET (POS pro .NET), nemusí selhat načtení objektů služby OPOS. Pokud vaše aplikace splňuje určité požadavky, můžete použít jeden ze dvou postupů popsaných v tomto tématu k vzájemné spolupráci s 32bitovými objekty služby OPOS.

POS pro aplikace .NET kompilované jako 32bitová verze by měla fungovat se všemi objekty služby OPOS a nevyžadují žádný z postupů popsaných v tomto tématu.

Požadavky

Aby vaše aplikace mohla používat postupy popsané v tomto tématu, musí splňovat všechny následující podmínky:

  • Vaše aplikace běží v 64bitovém systému Windows.
  • Vaše aplikace používá objekty služby OPOS.
  • Spustitelný soubor, který odkazuje na POS pro .NET, je zkompilován jako platforma MSIL (Microsoft Intermediate Language).
  • Všechna spravovaná sestavení odkazovaná aplikací jsou také zkompilována jako knihovna MSIL.

Za těchto podmínek modul CLR (Common Library Runtime) uvidí, že všechna spravovaná sestavení jsou rozhraní MSIL, takže se rozhodnete spustit spravovanou aplikaci jako 64bitový proces. Když se poS pro .NET pokusí načíst 32bitový objekt služby OPOS jako procesový server COM, nenačte se a zařízení nebude viditelné pro vaši aplikaci. Důvodem je to, že 64bitový proces nemůže načíst 32bitový server COM do svého procesního prostoru.

Tento problém můžete obejít pomocí jednoho z následujících dvou řešení:

Kompilace spravovaného procesu jako 32bitového procesu

Proces můžete vynutit spuštění jako 32bitový proces tím, že kompilujete hlavní spustitelný soubor tak, aby cílil na platformu x86 nebo anycpu32bitpreferred . To způsobí, že spravovaná aplikace běží jako 32bitová verze a načte objekt OPOS jako procesový server COM.

Kompilace aplikace jako 32bitová verze na příkazovém řádku

  1. Přidejte možnost kompilátoru do příkazu kompilátoru /platform:x86 jazyka C#, jak je znázorněno v následujícím příkladu:

    csc /platform:x86 <filename>.cs

    Další informace najdete v tématu /platform (možnosti kompilátoru jazyka C#) na webu MSDN.

Kompilace aplikace jako 32bitové verze v sadě Visual Studio 2013

  1. V sadě Microsoft Visual Studio 2013 otevřete projekt.

  2. Otevřete nabídku BUILD a vyberte Configuration Manager.

  3. V dialogovém okně Configuration Manager ve sloupci Platforma klikněte na buňku, rozbalte rozevírací nabídku a vyberte x86. Pokud x86 není k dispozici, vyberte <Nový...> a pak jako novou platformu vyberte x86 a klikněte na OK.

  4. Znovu sestavte projekt.

Zkompilujte spravovaný proces jako 64bitový proces a upravte registr MODELU COM objektu OPOS.

Registraci modelu COM objektu služby OPOS můžete upravit tak, aby používala 32bitový hostitelský proces. To způsobí, že systém Windows zpracovává komunikaci mezi procesy (IPC) a zařazování dat mezi 64bitovým spravovaným procesem a 32bitovým hostitelským procesem modelu COM.

Úprava registru MODELU COM objektu služby OPOS

  1. V registru vyhledejte klíč GUID objektu COM v části HKEY_CLASSES_ROOT/Wow6432Node/CLSID.

  2. Jakmile najdete klíč GUID objektu COM, přidejte novou řetězcovou hodnotu (REG_SZ). Nastavte název na AppID a nastavte data na IDENTIFIKÁTOR GUID objektu COM, včetně složených závorek.

  3. Do HKEY_CLASSES_ROOT /Wow6432Node/AppID přidejte nový klíč se stejným názvem jako klíč GUID objektu COM.

  4. Pod nový klíč, který jste právě přidali, přidejte novou řetězcovou hodnotu (REG_SZ). Nastavte název na DllSurrogate. Ponechte hodnotu prázdnou.

  5. V části HKEY_LOCAL_MACHINE/Software/Classes/AppID vytvořte nový klíč se stejným názvem jako identifikátor GUID objektu COM, pokud ještě neexistuje. Do tohoto klíče nemusíte přidávat žádné hodnoty.

Alternativně můžete použít následující skript Prostředí Windows PowerShell ke změně registru COM pro všechny objekty CCO (Common Control Objects OPOS) pro použití mimo procesové servery COM. Tento skript můžete spustit, abyste zajistili, že všechny objekty služby OPOS budou moct spolupracovat s 64bitovými aplikacemi. Skript musíte spustit z příkazového řádku Windows PowerShellu správce.

# 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"
}

Viz také

Další prostředky