Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Como os objetos de serviço OLE for 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 do Microsoft Point of Service for .NET (POS para .NET) podem falhar ao carregar objetos de serviço OPOS. Se seu 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.
Os aplicativos POS para .NET compilados como 32 bits devem funcionar com todos os objetos de serviço OPOS e não exigem 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 Microsoft intermediate language (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 falhará ao carregar 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 seu processo a ser executado como um processo de 32 bits compilando seu executável principal para direcionar a plataforma x86 ou anycpu32bitpreferred . Isso faz com que o aplicativo gerenciado seja executado como 32 bits e carregue o objeto OPOS como um servidor COM em processo.
Para compilar seu aplicativo como 32 bits no prompt de comando
Adicione a
/platform:x86opção do compilador ao comando do compilador C#, como no exemplo a seguir:csc /platform:x86 <filename>.csPara obter mais informações, consulte /platform (C# Compiler Options) no MSDN.
Para compilar seu aplicativo como 32 bits no Visual Studio 2013
No Microsoft Visual Studio 2013, abra seu projeto.
Abra o menu BUILD e selecione Configuration Manager.
Na caixa de diálogo Configuration Manager, na coluna Plataforma, clique na célula para expandir o menu suspenso e selecione x86. Se x86 não estiver disponível, selecione <Novo...>, selecione x86 como a nova plataforma e clique em OK.
Reconstrua 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 a empacotação de dados entre o processo gerenciado de 64 bits e o processo de host substituto 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 como o GUID do objeto COM, incluindo as chaves encaracoladas.
Adicione uma nova chave em HKEY_CLASSES_ROOT/Wow6432Node/AppID com o mesmo nome da chave GUID do objeto COM.
Sob a nova chave que você acabou de adicionar, adicione um novo valor de cadeia de caracteres (REG_SZ). Defina o nome como DllSurrogate. Deixe o valor vazio.
Crie uma nova chave em HKEY_LOCAL_MACHINE/Software/Classes/AppID com o mesmo nome do GUID do objeto COM, se ainda não existir. Não é necessário adicionar nenhum valor a essa chave.
Como alternativa, você pode usar o seguinte script do Windows PowerShell para modificar o registro COM para todos os objetos de controle comuns (CCO) OPOS para usar servidores COM fora do processo. Você pode executar esse script para garantir que todos os objetos de serviço OPOS sejam capazes de interoperar com aplicativos de 64 bits. Você deve executar o script a partir de um prompt de administrador do 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"
}