OPOS(OLE for Retail POS) 서비스 개체는 32비트 개체로만 존재하기 때문에 특정 상황에서는 .NET용 POS(.NET용 Microsoft Point of Service) 어셈블리를 참조하는 64비트 애플리케이션에서 OPOS 서비스 개체를 로드하지 못할 수 있습니다. 애플리케이션이 특정 요구 사항을 충족하는 경우 이 항목에서 설명하는 두 절차 중 하나를 사용하여 32비트 OPOS 서비스 개체와 상호 운용될 수 있습니다.
32비트로 컴파일된 .NET용 POS 애플리케이션은 모든 OPOS 서비스 개체에서 작동하며 이 항목에 설명된 절차는 필요하지 않습니다.
요구 사항
이 항목에 설명된 절차를 사용하려면 애플리케이션이 다음 조건을 모두 충족해야 합니다.
- 애플리케이션은 64비트 Windows에서 실행됩니다.
- 애플리케이션은 OPOS 서비스 개체를 사용합니다.
- .NET용 POS를 참조하는 실행 파일은 MSIL(Microsoft Intermediate Language)('anycpu' 플랫폼)로 컴파일됩니다.
- 애플리케이션에서 참조하는 모든 관리형 어셈블리도 MSIL로 컴파일됩니다.
이러한 조건에서 CLR(공용 라이브러리 런타임)은 모든 관리형 어셈블리가 MSIL임을 확인하므로 관리형 애플리케이션을 64비트 프로세스로 실행하도록 선택합니다. .NET용 POS가 32비트 OPOS 서비스 개체를 In-process COM 서버로 로드하려고 하면 로드에 실패하고 디바이스가 애플리케이션에 표시되지 않습니다. 이것은 64비트 프로세스가 32비트 COM 서버를 해당 프로세스 공간에 로드할 수 없기 때문입니다.
다음 두 가지 솔루션 중 하나를 사용하여 이 작업을 수행할 수 있습니다.
관리형 프로세스를 32비트 프로세스로 컴파일
주 실행 파일을 x86 또는 anycpu32bitpreferred 플랫폼을 대상으로 컴파일하여 프로세스를 강제로 32비트 프로세스로 실행할 수 있습니다. 이렇게 하면 관리형 앱이 32비트로 실행되고 OPOS 개체가 In-process COM 서버로 로드됩니다.
명령 프롬프트에서 애플리케이션을 32비트로 컴파일하려면
다음 예제와 같이
/platform:x86컴파일러 옵션을 C# 컴파일러 명령에 추가합니다.csc /platform:x86 <filename>.cs자세한 내용은 MSDN에서 /platform(C# 컴파일러 옵션)을 참조하세요.
Visual Studio 2013에서 애플리케이션을 32비트로 컴파일하려면
Microsoft Visual Studio 2013에서 프로젝트를 엽니다.
빌드 메뉴를 열고 Configuration Manager를 선택합니다.
Configuration Manager 대화 상자의 플랫폼 열에서 셀을 클릭하여 드롭다운 메뉴를 확장하고 x86을 선택합니다. x86을 사용할 수 없는 경우 <새로 만들기…>를 선택한 후 x86을 새 플랫폼으로 선택하고 확인을 클릭합니다.
프로젝트를 다시 빌드합니다.
관리 프로세스를 64비트 프로세스로 컴파일하고 OPOS 개체의 COM 레지스트리를 수정합니다.
32비트 호스트 프로세스를 사용하도록 OPOS 서비스 개체의 COM 등록을 수정할 수 있습니다. 이로 인해 Windows는 64비트 관리 프로세스와 32비트 COM 서로게이트 호스트 프로세스 간에 IPC(프로세스 간 통신) 및 데이터 마샬링을 처리합니다.
OPOS 서비스 개체의 COM 레지스트리를 수정하려면
레지스트리의 HKEY_CLASSES_ROOT/Wow6432Node/CLSID 아래에서 COM 개체 GUID 키를 찾습니다.
COM 개체 GUID 키를 찾으면 새 문자열 값(REG_SZ)을 추가합니다. 이름을 AppID로 설정하고 데이터를 COM 개체 GUID로 설정합니다(중괄호 포함).
COM 개체 GUID 키와 이름이 같은 새 키를 HKEY_CLASSES_ROOT/Wow6432Node/AppID 아래에 추가합니다.
방금 추가한 새 키 아래에 새 문자열 값(REG_SZ)을 추가합니다. 이름을 DllSurrogate로 설정합니다. 값은 비워 둡니다.
COM 개체의 GUID와 이름이 같은 새 키를 HKEY_LOCAL_MACHINE/Software/Classes/AppID 아래에 만듭니다(아직 없는 경우). 이 키에 값을 추가할 필요가 없습니다.
또는 다음 Windows PowerShell 스크립트를 사용하여 모든 OPOS CCO(공용 제어 개체)에 대한 COM 레지스트리가 out of process COM 서버를 사용하도록 수정할 수 있습니다. 이 스크립트를 실행하여 모든 OPOS 서비스 개체가 64비트 애플리케이션과 상호 운용되도록 할 수 있습니다. 관리자 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"
}
참고 항목
기타 리소스
.NET