ClickOnce 보안, 응용 프로그램 버전 관리, 매니페스트 구문 및 의미 체계와 관련된 다양한 문제가 있으며, 이로 인해 ClickOnce 배포가 실패할 수 있습니다.
ClickOnce 및 Windows 사용자 계정 컨트롤
Windows Vista 이상 버전의 Windows에서는 현재 사용자가 관리자 권한이 있는 계정으로 로그인되어 있더라도 기본적으로 응용 프로그램이 표준 사용자로 실행됩니다. 응용 프로그램이 관리자 권한이 필요한 작업을 수행해야 하는 경우 운영 체제에 알리고 사용자에게 관리자 자격 증명을 입력하라는 메시지를 표시합니다. UAC(사용자 계정 컨트롤)라고 하는 이 기능은 응용 프로그램이 사용자의 명시적인 승인 없이 전체 운영 체제에 영향을 줄 수 있는 변경 작업을 수행하지 못하도록 합니다. Windows 응용 프로그램은 응용 프로그램 매니페스트의 섹션에서 특성을 requestedExecutionLevel
지정하여 trustInfo
이 권한 상승이 필요하다고 선언합니다.
응용 프로그램이 보안 권한 상승 공격에 노출될 위험이 있기 때문에 클라이언트에 대해 UAC를 사용하는 경우 ClickOnce 응용 프로그램은 권한 상승을 요청할 수 없습니다. 특성을 requestedExecutionLevel
설정 requireAdministrator
하려고 시도하거나 highestAvailable
Windows Vista 이상 버전에 설치되지 않는 ClickOnce 응용 프로그램.
경우에 따라 ClickOnce 응용 프로그램이 Windows의 설치 관리자 검색 논리로 인해 관리자 권한으로 실행하려고 할 수 있습니다. 이 경우 응용 프로그램 매니페스트requestedExecutionLevel
의 특성을 로 설정할 asInvoker
수 있습니다. 이렇게 하면 응용 프로그램 자체가 권한 상승 없이 실행됩니다. Visual Studio는 이 특성을 모든 응용 프로그램 매니페스트에 자동으로 추가합니다.
응용 프로그램의 전체 수명 동안 관리자 권한이 필요한 응용 프로그램을 개발하는 경우 대신 MSI(Windows Installer) 기술을 사용하여 응용 프로그램을 배포하는 것이 좋습니다. 자세한 내용은 Windows Installer 기본 사항을 참조하세요.
온라인 신청 할당량 및 부분 신뢰 신청
ClickOnce 응용 프로그램이 설치를 통하지 않고 온라인으로 실행되는 경우 온라인 응용 프로그램에 대해 할당된 할당량 내에 맞아야 합니다. 또한 제한된 보안 권한 집합과 같이 부분 신뢰로 실행되는 네트워크 애플리케이션은 할당량 크기의 절반보다 클 수 없습니다.
비고
.NET Core 및 .NET 5 이상용 ClickOnce에서는 코드 액세스 보안이 필요한 부분 신뢰가 지원되지 않습니다. .NET Framework에서 코드 액세스 보안의 사용은 모범 사례가 아니며 권장되지 않습니다.
온라인 응용 프로그램 할당량을 변경하는 방법에 대한 자세한 내용 및 지침은 ClickOnce 캐시 개요를 참조하십시오.
버전 관리 문제
어셈블리에 강력한 이름을 할당하고 응용 프로그램 업데이트를 반영하기 위해 어셈블리 버전 번호를 증가시키는 경우 문제가 발생할 수 있습니다. 강력한 이름의 어셈블리에 대한 참조로 컴파일된 모든 어셈블리는 자체를 다시 컴파일해야 하며, 그렇지 않으면 어셈블리가 이전 버전을 참조하려고 합니다. 어셈블리는 어셈블리가 바인딩 요청에서 이전 버전 값을 사용하기 때문에 이 작업을 시도합니다.
예를 들어, 버전이 1.0.0.0인 자체 프로젝트에 강력한 이름의 어셈블리가 있다고 가정해 보겠습니다. 어셈블리를 컴파일한 후 기본 응용 프로그램이 포함된 프로젝트에 대한 참조로 추가합니다. 어셈블리를 업데이트하고 버전을 1.0.0.1로 증가시킨 다음 응용 프로그램을 다시 컴파일하지 않고 배포하려고 하면 응용 프로그램이 런타임에 어셈블리를 로드할 수 없습니다.
이 오류는 ClickOnce 매니페스트를 수동으로 편집하는 경우에만 발생할 수 있습니다. Visual Studio를 사용하여 배포를 생성하는 경우 이 오류가 발생하지 않아야 합니다.
매니페스트에서 개별 .NET Framework 어셈블리 지정
이전 버전의 .NET Framework 어셈블리를 참조하기 위해 ClickOnce 배포를 수동으로 편집한 경우 응용 프로그램이 로드되지 않습니다. 예를 들어, 매니페스트에 지정된 버전 이전의 .NET Framework 버전에 대한 System.Net 어셈블리에 대한 참조를 추가한 경우 오류가 발생합니다. 일반적으로 응용 프로그램이 실행되는 .NET Framework의 버전이 응용 프로그램 매니페스트에서 종속성으로 지정되므로 개별 .NET Framework 어셈블리에 대한 참조를 지정하려고 시도해서는 안 됩니다.
매니페스트 구문 분석 문제
ClickOnce에서 사용하는 매니페스트 파일은 XML 파일이며, XML 구문 규칙을 따라야 하고 관련 XML 스키마에 정의된 요소와 특성만 사용해야 하는 올바른 형식이면서 유효해야 합니다.
매니페스트 파일에서 문제를 일으킬 수 있는 것은 작은따옴표 또는 큰따옴표와 같은 특수 문자가 포함된 애플리케이션의 이름을 선택하는 것입니다. 응용 프로그램 이름은 ClickOnce ID의 일부입니다. ClickOnce는 현재 특수 문자가 포함된 ID를 구문 분석하지 않습니다. 응용 프로그램이 활성화되지 않으면 이름에 알파벳 문자와 숫자만 사용하고 있는지 확인하고 다시 배포해 보십시오.
배포 또는 응용 프로그램 매니페스트를 수동으로 편집한 경우 의도치 않게 손상되었을 수 있습니다. 손상된 매니페스트로 인해 올바른 ClickOnce 설치가 불가능합니다. ClickOnce 오류 대화 상자에서 자세히를 클릭하고 로그에서 오류 메시지를 읽어 런타임에 이러한 오류를 디버깅할 수 있습니다. 로그에는 다음 메시지 중 하나가 나열됩니다.
구문 오류에 대한 설명과 오류가 발생한 줄 번호 및 문자 위치입니다.
매니페스트의 스키마를 위반하는 데 사용되는 요소 또는 특성의 이름입니다. XML을 매니페스트에 수동으로 추가한 경우 매니페스트 스키마에 대한 추가 사항을 비교해야 합니다. 자세한 내용은 ClickOnce 배포 매니페스트 및 ClickOnce 응용 프로그램 매니페스트를 참조하십시오.
ID 충돌입니다. 배포 및 응용 프로그램 매니페스트의 종속성 참조는 및
name
특성 모두에서publicKeyToken
고유해야 합니다. 매니페스트 내의 두 요소 간에 두 속성이 모두 일치하면 매니페스트 구문 분석이 성공하지 못합니다.
매니페스트 또는 응용 프로그램을 수동으로 변경할 때의 주의 사항
응용 프로그램 매니페스트를 업데이트할 때는 응용 프로그램 매니페스트와 배포 매니페스트 모두에 다시 서명해야 합니다. 배포 매니페스트에는 해당 파일의 해시와 디지털 서명을 포함하는 응용 프로그램 매니페스트에 대한 참조가 포함되어 있습니다.
배포 공급자 사용에 대한 주의 사항
ClickOnce 배포 매니페스트에는 응용 프로그램을 설치하고 서비스해야 하는 위치의 전체 경로를 가리키는 속성이 있습니다 deploymentProvider
.
<deploymentProvider codebase="http://myserver/myapp.application" />
이 경로는 ClickOnce에서 응용 프로그램을 만들 때 설정되며 설치된 응용 프로그램에 필수입니다. 경로는 ClickOnce 설치 관리자가 응용 프로그램을 설치하고 업데이트를 검색하는 표준 위치를 가리킵니다.
xcopy 명령을 사용하여 ClickOnce 응용 프로그램을 다른 위치에 복사하고 속성을 변경하지 deploymentProvider
않으면 ClickOnce는 응용 프로그램을 다운로드하려고 할 때 원래 위치를 다시 참조합니다.
응용 프로그램을 이동하거나 복사하려면 클라이언트가 실제로 새 위치에서 설치되도록 경로도 업데이트해야 deploymentProvider
합니다. 이 경로를 업데이트하는 것은 응용 프로그램을 설치한 경우 대부분 문제가 됩니다. 항상 원래 URL을 통해 시작되는 온라인 애플리케이션의 경우 는 deploymentProvider
선택 사항입니다. 설정된 경우 deploymentProvider
적용되고, 그렇지 않은 경우 응용 프로그램을 시작하는 데 사용되는 URL이 응용 프로그램 파일을 다운로드하기 위한 기본 URL로 사용됩니다.
비고
매니페스트를 업데이트할 때마다 다시 서명해야 합니다.