Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Dado que los objetos de servicio de OLE for Retail POS (OPOS) solo existen como objetos de 32 bits, en determinadas circunstancias las aplicaciones de 64 bits que hacen referencia a ensamblados de Microsoft Point of Service for .NET (POS for .NET) podrían no cargar objetos de servicio OPOS. Si la aplicación cumple ciertos requisitos, puede usar uno de los dos procedimientos descritos en este tema para interoperar con objetos de servicio OPOS de 32 bits.
Las aplicaciones de POS for .NET compiladas en 32 bits deberían funcionar con todos los objetos de servicio OPOS, y no requieren ninguno de los procedimientos descritos en este tema.
Requisitos
La aplicación debe cumplir todas las condiciones siguientes para poder usar los procedimientos descritos en este tema:
- La aplicación se ejecuta en Windows de 64 bits.
- La aplicación usa objetos de servicio OPOS.
- El ejecutable que hace referencia a POS for .NET se compila con el lenguaje intermedio de Microsoft (MSIL) (plataforma "anycpu").
- Todos los ensamblados administrados a los que hace referencia la aplicación también se compilan con MSIL.
En estas condiciones, Common Library Runtime (CLR) verá que todos los ensamblados administrados son MSIL, por lo que elegirá ejecutar la aplicación administrada como un proceso de 64 bits. Cuando POS for .NET intenta cargar un objeto de servicio OPOS de 32 bits como un servidor COM In-Process, no se cargará y el dispositivo no será visible para la aplicación. Esto se debe a que un proceso de 64 bits no puede cargar un servidor COM de 32 bits en su espacio de proceso.
Para solucionarlo, tiene dos opciones:
Compilar el proceso administrado como un proceso de 32 bits.
Puede forzar que el proceso se ejecute como un proceso de 32 bits mediante la compilación del ejecutable principal para que se dirija a la plataforma x86 o anycpu32bitpreferred. Esto hace que la aplicación administrada se ejecute como un proceso de 32 bits y cargue el objeto OPOS como un servidor COM In-Process.
Para compilar la aplicación como un proceso de 32 bits en el símbolo del sistema, haga lo siguiente:
Agregue la opción del compilador
/platform:x86
al comando del compilador de C#, como en el ejemplo siguiente:csc /platform:x86 <filename>.cs
Para más información, consulte /platform (Opciones del compilador de C#) en MSDN.
Para compilar la aplicación como un proceso de 32 bits en Visual Studio 2013, haga lo siguiente:
En Microsoft Visual Studio 2013, abra el proyecto.
Abra el menú COMPILAR y seleccione Configuration Manager.
En el cuadro de diálogo Configuration Manager, en la columna Plataforma, haga clic en la celda para expandir el menú desplegable y seleccione x86. Si x86 no está disponible, seleccione <Nuevo...> y, luego, elija x86 como la nueva plataforma y haga clic en Aceptar.
Recompile el proyecto.
Compile el proceso administrado como un proceso de 64 bits y modifique el registro COM del objeto OPOS.
Puede modificar el registro COM del objeto de servicio OPOS para usar un proceso de host de 32 bits. Esto hace que Windows controle la comunicación entre procesos (IPC) y la serialización de datos entre el proceso administrado de 64 bits y el proceso de host suplente COM de 32 bits.
Para modificar el registro COM del objeto de servicio OPOS, haga lo siguiente:
En el Registro, busque la clave GUID del objeto COM en HKEY_CLASSES_ROOT/Wow6432Node/CLSID.
Cuando encuentre la clave GUID del objeto COM, agregue un nuevo valor de cadena (REG_SZ). Establezca el nombre en AppID y establezca los datos en el GUID del objeto COM, incluidas las llaves.
Agregue una nueva clave en HKEY_CLASSES_ROOT/Wow6432Node/AppID con el mismo nombre que la clave GUID del objeto COM.
En la nueva clave que acaba de agregar, agregue un nuevo valor de cadena (REG_SZ). Establezca el nombre en DllSurrogate. Deje este valor vacío.
Cree una nueva clave en HKEY_LOCAL_MACHINE/Software/Classes/AppID con el mismo nombre que el GUID del objeto COM, si aún no existe. No es necesario agregar ningún valor a esta clave.
Como alternativa, puede usar el siguiente script de Windows PowerShell para modificar el registro COM para que todos los objetos de control común (CCO) OPOS usen servidores COM fuera de proceso. Puede ejecutar este script para asegurarse de que todos los objetos de servicio OPOS podrán interoperar con aplicaciones de 64 bits. Debe ejecutar el script desde un símbolo del sistema de Windows PowerShell con privilegios de administrador.
# 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"
}