Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Da OPOS-Serviceobjekte (OLE for Retail POS) nur als 32-Bit-Objekte vorhanden sind, können unter bestimmten Umständen 64-Bit-Anwendungen, die auf Microsoft Point of Service for .NET-Assemblys (POS for .NET) verweisen, OPOS-Serviceobjekte nicht laden. Wenn Ihre Anwendung bestimmte Anforderungen erfüllt, können Sie eines der beiden in diesem Thema beschriebenen Verfahren verwenden, um mit 32-Bit-OPOS-Serviceobjekten zu arbeiten.
Mit 32-Bit kompilierte POS für .NET-Anwendungen sollten mit allen OPOS-Serviceobjekten funktionieren und keine der in diesem Thema beschriebenen Prozeduren erfordern.
Requirements (Anforderungen)
Ihre Anwendung muss alle folgenden Bedingungen erfüllen, um die in diesem Thema beschriebenen Verfahren verwenden zu können:
- Ihre Anwendung wird unter 64-Bit-Windows ausgeführt.
- Ihre Anwendung verwendet OPOS-Serviceobjekte.
- Die ausführbare Datei, die auf POS für .NET verweist, wird als Microsoft Intermediate Language (MSIL) ('anycpu'-Plattform) kompiliert.
- Alle verwalteten Assemblys, auf die von der Anwendung verwiesen wird, werden auch als MSIL kompiliert.
Unter diesen Bedingungen sieht die Common Library Runtime (CLR), dass alle verwalteten Assemblys MSIL-Assemblys sind, sodass die verwaltete Anwendung als 64-Bit-Prozess ausgeführt werden soll. Wenn POS für .NET versucht, ein 32-Bit-OPOS-Serviceobjekt als prozessinternen COM-Server zu laden, kann es nicht geladen werden, und das Gerät ist für Ihre Anwendung nicht sichtbar. Dies liegt daran, dass ein 64-Bit-Prozess keinen 32-Bit-COM-Server in seinen Prozessbereich laden kann.
Sie können dies umgehen, indem Sie eine der folgenden beiden Lösungen verwenden:
Kompilieren des verwalteten Prozesses als 32-Bit-Prozess
Sie können erzwingen, dass Ihr Prozess als 32-Bit-Prozess ausgeführt wird, indem Sie Ihre ausführbare Hauptdatei für die x86- oder anycpu32bit-Plattform kompilieren. Dadurch wird die verwaltete App als 32-Bit-Version ausgeführt und das OPOS-Objekt als prozessinterner COM-Server geladen.
So kompilieren Sie Ihre Anwendung an der Eingabeaufforderung mit 32-Bit
Fügen Sie ihrem C#-Compilerbefehl die
/platform:x86
-Compileroption hinzu, wie im folgenden Beispiel gezeigt:csc /platform:x86 <filename>.cs
Weitere Informationen finden Sie unter /platform (C#-Compileroptionen) in MSDN.
So kompilieren Sie Ihre Anwendung mit 32-Bit in Visual Studio 2013
Öffnen Sie in Microsoft Visual Studio 2013 Ihr Projekt.
Öffnen Sie das Menü ERSTELLEN, und wählen Sie Konfigurations-Manager aus.
Klicken Sie im Dialogfeld Konfigurations-Manager in der Spalte Plattform auf die Zelle, um das Dropdownmenü zu erweitern, und wählen Sie x86 aus. Wenn x86 nicht verfügbar ist, wählen Sie <Neu...> und dann x86 als neue Plattform aus, und klicken Sie auf OK.
Erstellen Sie das Projekt neu.
Kompilieren Sie den verwalteten Prozess als 64-Bit-Prozess, und ändern Sie die COM-Registrierung des OPOS-Objekts.
Sie können die COM-Registrierung des OPOS-Serviceobjekts so ändern, dass ein 32-Bit-Hostprozess verwendet wird. Dies führt dazu, dass Windows die prozessübergreifende Kommunikation (Inter-Process Communication, IPC) und das Marshalling von Daten zwischen dem verwalteten 64-Bit-Prozess und dem 32-Bit-COM-Ersatzhostprozess verarbeitet.
So ändern Sie die COM-Registrierung des OPOS-Serviceobjekts
Suchen Sie in der Registrierung unter HKEY_CLASSES_ROOT/Wow6432Node/CLSID nach Ihrem GUID-Schlüssel für das COM-Objekt.
Nachdem Sie den GUID-Schlüssel des COM-Objekts gefunden haben, fügen Sie einen neuen Zeichenfolgenwert (REG_SZ) hinzu. Legen Sie den Namen auf AppID fest, und legen Sie die Daten auf die COM-Objekt-GUID fest, einschließlich der geschweiften Klammern.
Fügen Sie unter HKEY_CLASSES_ROOT/Wow6432Node/AppID einen neuen Schlüssel hinzu, der denselben Namen wie der GUID-Schlüssel des COM-Objekts hat.
Fügen Sie unter dem neuen Schlüssel, den Sie gerade hinzugefügt haben, einen neuen Zeichenfolgenwert (REG_SZ) hinzu. Legen Sie den Namen auf DllSurrogate fest. Lassen Sie diesen Wert leer.
Erstellen Sie unter HKEY_LOCAL_MACHINE/Software/Classes/AppID einen neuen Schlüssel, der denselben Namen wie die GUID des COM-Objekts hat, sofern er noch nicht vorhanden ist. Sie müssen diesem Schlüssel keine Werte hinzufügen.
Alternativ können Sie das folgende Windows PowerShell Skript verwenden, um die COM-Registrierung für alle OPOS Common Control Objects (CCO) so zu ändern, dass prozessexterne COM-Server verwendet werden. Sie können dieses Skript ausführen, um sicherzustellen, dass alle OPOS-Serviceobjekte mit 64-Bit-Anwendungen zusammenarbeiten können. Sie müssen das Skript von einer Windows PowerShell-Administratoreingabeaufforderung aus ausführen.
# 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"
}