Partager via


Compatibilité des applications POS pour .NET avec les objets de service OPOS 32 bits (documentation du SDK POS pour .NET v1.14)

Étant donné que les objets de service OLE pour Retail POS (OPOS) existent uniquement en tant qu’objets 32 bits, dans certaines circonstances, les applications 64 bits qui référencent les assemblys Microsoft Point of Service pour .NET (POS pour .NET) peuvent ne pas charger correctement les objets de service OPOS. Si votre application répond à certaines exigences, vous pouvez utiliser l’une des deux procédures décrites dans cette rubrique pour interagir avec les objets de service OPOS 32 bits.

Les applications POS pour .NET compilées en 32 bits devraient fonctionner avec tous les objets de service OPOS et ne nécessitent aucune des procédures décrites dans cette rubrique.

Spécifications

Votre application doit remplir toutes les conditions suivantes pour pouvoir utiliser les procédures décrites dans cette rubrique :

  • Votre application s’exécute sur Windows 64 bits.
  • Votre application utilise des objets de service OPOS.
  • L’exécutable qui fait référence à POS pour .NET est compilé en tant que langage intermédiaire Microsoft (MSIL) (plateforme « anycpu »).
  • Tous les assemblys managés référencés par l’application sont également compilés en tant que MSIL.

Dans ces conditions, le Common Library Runtime (CLR) voit que tous les assemblys managés sont MSIL et choisit donc d’exécuter l’application managée en tant que processus 64 bits. Lorsque POS pour .NET tente de charger un objet de service OPOS 32 bits en tant que serveur COM in-process, il échoue à charger et l’appareil ne sera pas visible par votre application. Cela est dû au fait qu’un processus 64 bits ne peut pas charger un serveur COM 32 bits dans son espace de processus.

Vous pouvez contourner ce problème à l’aide de l’une des deux solutions suivantes :

Compiler le processus managé en tant que processus 32 bits

Vous pouvez forcer votre processus à s’exécuter en tant que processus 32 bits en compilant votre exécutable principal pour cibler la plateforme x86 ou anycpu32bitpreferred. Cela entraîne l’exécution de l’application managée en 32 bits et le chargement de l’objet OPOS en tant que serveur COM in-process.

Pour compiler votre application en 32 bits à l’invite de commandes

  1. Ajoutez l’option de compilateur /platform:x86 à votre commande de compilateur C#, comme dans l’exemple suivant :

    csc /platform:x86 <filename>.cs

    Pour plus d’informations, consultez /platform (options du compilateur C#) sur MSDN.

Pour compiler votre application en 32 bits dans Visual Studio 2013

  1. Dans Microsoft Visual Studio 2013, ouvrez votre projet.

  2. Ouvrez le menu BUILD et sélectionnez Configuration Manager.

  3. Dans la boîte de dialogue Configuration Manager, dans la colonne Plateforme, cliquez sur la cellule pour développer le menu déroulant et sélectionnez x86. Si x86 n’est pas disponible, sélectionnez <Nouveau...>, puis x86 comme nouvelle plateforme, et cliquez sur OK.

  4. Regénérez le projet.

Compilez le processus managé en tant que processus 64 bits et modifiez le registre COM de l’objet OPOS

Vous pouvez modifier l’inscription COM de l’objet de service OPOS pour utiliser un processus hôte 32 bits. Cela amène Windows à gérer la communication inter-processus (IPC) et le marshaling des données entre le processus managé 64 bits et le processus hôte de substitution COM 32 bits.

Pour modifier le registre COM de l’objet de service OPOS

  1. Dans le Registre, recherchez votre clé GUID d’objet COM sous HKEY_CLASSES_ROOT/Wow6432Node/CLSID.

  2. Une fois que vous avez localisé la clé GUID de l’objet COM, ajoutez une nouvelle valeur de chaîne (REG_SZ). Définissez le nom sur AppID et définissez les données sur le GUID de l’objet COM, y compris les accolades.

  3. Ajoutez une nouvelle clé sous HKEY_CLASSES_ROOT/Wow6432Node/AppID avec le même nom que la clé GUID de l’objet COM.

  4. Sous la nouvelle clé que vous venez d’ajouter, ajoutez une nouvelle valeur de chaîne (REG_SZ). Définissez le nom sur DllSurrogate. Laissez la valeur vide.

  5. Créez une clé sous HKEY_LOCAL_MACHINE/Software/Classes/AppID avec le même nom que le GUID de l’objet COM, s’il n’existe pas déjà. Vous n’avez pas besoin d’ajouter de valeurs à cette clé.

Vous pouvez également utiliser le script Windows PowerShell suivant pour modifier le registre COM pour que tous les objets de contrôle communs OPOS (CCO) utilisent des serveurs COM hors processus. Vous pouvez exécuter ce script pour vous assurer que tous les objets de service OPOS seront en mesure d’interagir avec des applications 64 bits. Vous devez exécuter le script à partir d’une invite administrateur 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"
}

Voir aussi

Autres ressources