Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Como os objetos de serviço OLE para Retail POS (OPOS) só existem como objetos de 32 bits, em determinadas circunstâncias, os aplicativos de 64 bits que fazem referência a assemblies de Ponto de Serviço do Microsoft para .NET (POS para .NET) podem falhar ao carregar objetos de serviço OPOS. Se o aplicativo atender a determinados requisitos, você poderá usar um dos dois procedimentos discutidos neste tópico para interoperar com objetos de serviço OPOS de 32 bits.
O POS para aplicativos .NET compilados como de 32 bits deve funcionar com todos os objetos de serviço OPOS e não requer nenhum dos procedimentos descritos neste tópico.
Requisitos
Seu aplicativo deve atender a todas as seguintes condições para usar os procedimentos descritos neste tópico:
- Seu aplicativo é executado no Windows de 64 bits.
- Seu aplicativo usa objetos de serviço OPOS.
- O executável que faz referência ao POS para .NET é compilado como linguagem intermediária do Microsoft (MSIL) (plataforma 'anycpu').
- Todos os assemblies gerenciados referenciados pelo aplicativo também são compilados como MSIL.
Nessas condições, o Common Library Runtime (CLR) verá que todos os assemblies gerenciados são MSIL, portanto, ele optará por executar o aplicativo gerenciado como um processo de 64 bits. Quando o POS para .NET tenta carregar um objeto de serviço OPOS de 32 bits como um servidor COM em processo, ele não será carregado e o dispositivo não ficará visível para seu aplicativo. Isso ocorre porque um processo de 64 bits não pode carregar um servidor COM de 32 bits em seu espaço de processo.
Você pode contornar isso usando uma das duas soluções a seguir:
Compilar o processo gerenciado como um processo de 32 bits
Você pode forçar o processo a ser executado como um processo de 32 bits compilando o executável principal para direcionar a plataforma x86 ou anycpu32bitpreferred. Isso faz com que o aplicativo gerenciado seja executado como de 32 bits e carregue o objeto OPOS como um servidor COM em processo.
Para compilar seu aplicativo como de 32 bits no prompt de comando
Adicione a opção do compilador
/platform:x86ao comando do compilador C#, como no exemplo a seguir:csc /platform:x86 <filename>.csPara obter mais informações, confira /platform (Opção do compilador C#) em MSDN.
Para compilar seu aplicativo como de 32 bits no Visual Studio 2013
Em Microsoft Visual Studio 2013, abra o projeto.
Abra o menu BUILD e selecione Gerenciador de Configuração.
Na caixa de diálogo Gerenciador de Configuração, na coluna Plataforma, clique na célula para expandir o menu suspenso e selecione x86. Se o x86 não estiver disponível, selecione <Novo...> e, em seguida, selecione x86 como a nova plataforma e clique em OK.
Recompile o projeto.
Compile o processo gerenciado como um processo de 64 bits e modifique o registro COM do objeto OPOS
Você pode modificar o registro COM do objeto de serviço OPOS para usar um processo de host de 32 bits. Isso faz com que o Windows manipule a comunicação entre processos (IPC) e o marshaling de dados entre o processo gerenciado de 64 bits e o processo de host alternativo COM de 32 bits.
Para modificar o registro COM do objeto de serviço OPOS
No registro, localize a chave GUID do objeto COM em HKEY_CLASSES_ROOT/Wow6432Node/CLSID.
Depois de localizar a chave GUID do objeto COM, adicione um novo valor de cadeia de caracteres (REG_SZ). Defina o nome como AppID e defina os dados para o GUID do objeto COM, incluindo os colchetes.
Adicione uma nova chave em HKEY_CLASSES_ROOT/Wow6432Node/AppID com o mesmo nome que a chave GUID do objeto COM.
Na nova chave que você acabou de adicionar, adicione um novo valor de cadeia de caracteres (REG_SZ). Defina o nome como DllSurrogate. Mantenha esse valor vazio.
Crie uma nova chave em HKEY_LOCAL_MACHINE/Software/Classes/AppID com o mesmo nome que o GUID do objeto COM, caso ainda não exista. Você não precisa adicionar nenhum valor a essa chave.
Como alternativa, você pode usar o script Windows PowerShell a seguir para modificar o registro COM de todos os Objetos de Controle Comum (CCO) do OPOS para usar servidores COM fora do processo. Você pode executar esse script para garantir que todos os objetos de serviço OPOS possam interoperar com aplicativos de 64 bits. Você deve executar o script de um prompt de Windows PowerShell 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"
}