Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Karena objek layanan OLE untuk Retail POS (OPOS) hanya ada sebagai objek 32-bit, dalam keadaan tertentu aplikasi 64-bit yang mereferensikan rakitan Microsoft Point of Service untuk .NET (POS untuk .NET) mungkin gagal memuat objek layanan OPOS. Jika aplikasi Anda memenuhi persyaratan tertentu, Anda dapat menggunakan salah satu dari dua prosedur yang dibahas dalam topik ini untuk beroperasi dengan objek layanan OPOS 32-bit.
POS untuk aplikasi .NET yang dikompilasi sebagai 32-bit harus bekerja dengan semua objek layanan OPOS, dan tidak memerlukan prosedur apa pun yang dijelaskan dalam topik ini.
Persyaratan
Aplikasi Anda harus memenuhi semua kondisi berikut untuk menggunakan prosedur yang dijelaskan dalam topik ini:
- Aplikasi Anda berjalan pada Windows 64-bit.
- Aplikasi Anda menggunakan objek layanan OPOS.
- Executable yang mereferensikan POS untuk .NET dikompilasi sebagai microsoft intermediate language (MSIL) (platform'anycpu').
- Semua rakitan terkelola yang dirujuk oleh aplikasi juga dikompilasi sebagai MSIL.
Dalam kondisi ini, Common Library Runtime (CLR) akan melihat bahwa semua rakitan terkelola adalah MSIL sehingga akan memilih untuk menjalankan aplikasi terkelola sebagai proses 64-bit. Ketika POS untuk .NET mencoba memuat objek layanan OPOS 32-bit sebagai server COM dalam proses, itu akan gagal dimuat dan perangkat tidak akan terlihat oleh aplikasi Anda. Ini karena proses 64-bit tidak dapat memuat server COM 32-bit ke ruang prosesnya.
Anda dapat mengatasinya dengan menggunakan salah satu dari dua solusi berikut:
Mengkompilasi proses terkelola sebagai proses 32-bit
Anda dapat memaksa proses Anda untuk berjalan sebagai proses 32-bit dengan mengkompilasi executable utama Anda untuk menargetkan platform x86 atau anycpu32bitpreferred . Ini menyebabkan aplikasi terkelola berjalan sebagai 32-bit dan memuat objek OPOS sebagai server COM dalam proses.
Untuk mengkompilasi aplikasi Anda sebagai 32-bit pada prompt perintah
/platform:x86Tambahkan opsi pengkompilasi ke perintah pengkompilasi C#Anda, seperti dalam contoh berikut:csc /platform:x86 <filename>.csUntuk informasi selengkapnya, lihat /platform (C# Compiler Options) di MSDN.
Untuk mengkompilasi aplikasi Anda sebagai 32-bit di Visual Studio 2013
Di Microsoft Visual Studio 2013, buka proyek Anda.
Buka menu BUILD dan pilih Configuration Manager.
Dalam kotak dialog Configuration Manager , di kolom Platform , klik sel untuk memperluas menu drop-down dan pilih x86. Jika x86 tidak tersedia, pilih <Baru...>, lalu pilih x86 sebagai platform baru dan klik OK.
Membangun kembali proyek.
Mengkompilasi proses terkelola sebagai proses 64-bit dan memodifikasi registri COM objek OPOS
Anda dapat memodifikasi pendaftaran COM objek layanan OPOS untuk menggunakan proses host 32-bit. Hal ini menyebabkan Windows menangani komunikasi antarproses (IPC) dan marshalling data antara proses terkelola 64-bit dan proses host pengganti COM 32-bit.
Untuk mengubah registri COM dari objek layanan OPOS
Di registri, temukan kunci GUID objek COM Anda di bawah HKEY_CLASSES_ROOT/Wow6432Node/CLSID.
Setelah Anda menemukan kunci GUID objek COM, tambahkan nilai string baru (REG_SZ). Atur nama ke AppID dan atur data ke GUID objek COM, termasuk kurung kurawal.
Tambahkan kunci baru di bawah HKEY_CLASSES_ROOT/Wow6432Node/AppID dengan nama yang sama dengan kunci GUID objek COM.
Di bawah kunci baru yang baru saja Anda tambahkan, tambahkan nilai string baru (REG_SZ). Atur nama ke DllSurrogate. Biarkan nilai kosong.
Buat kunci baru di bawah HKEY_LOCAL_MACHINE/Software/Classes/AppID dengan nama yang sama dengan GUID objek COM, jika belum ada. Anda tidak perlu menambahkan nilai apa pun ke kunci ini.
Atau, Anda dapat menggunakan skrip Windows PowerShell berikut untuk memodifikasi registri COM untuk semua Objek Kontrol Umum (CCO) OPOS untuk menggunakan server COM yang tidak memproses. Anda dapat menjalankan skrip ini untuk memastikan bahwa semua objek layanan OPOS akan dapat beroperasi dengan aplikasi 64-bit. Anda harus menjalankan skrip dari administrator Windows PowerShell prompt.
# 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"
}