Freigeben über


POS für .NET-Anwendungskompatibilität mit 32-Bit-OPOS-Serviceobjekten (POS für .NET v1.14 SDK-Dokumentation)

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

  1. 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

  1. Öffnen Sie in Microsoft Visual Studio 2013 Ihr Projekt.

  2. Öffnen Sie das Menü ERSTELLEN, und wählen Sie Konfigurations-Manager aus.

  3. 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.

  4. 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

  1. Suchen Sie in der Registrierung unter HKEY_CLASSES_ROOT/Wow6432Node/CLSID nach Ihrem GUID-Schlüssel für das COM-Objekt.

  2. 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.

  3. 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.

  4. 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.

  5. 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"
}

Weitere Informationen

Weitere Ressourcen