다음을 통해 공유


C#/WinRT 구성 요소 오류 진단

이 문서에서는 C#/WinRT로 작성된 Windows 런타임 구성 요소의 제한 사항에 대한 추가 정보를 제공합니다. 작성자가 구성 요소를 빌드할 때 C#/WinRT의 오류 메시지에 제공되는 정보를 확장합니다. 기존 UWP .NET 네이티브 관리형 구성 요소의 경우 C# WinRT 구성 요소에 대한 메타데이터는 .NET 도구인 Winmdexp.exe를 사용하여 생성됩니다. 이제는 Windows 런타임 지원이 .NET에서 분리되었으므로 C#/WinRT는 구성 요소에서 .winmd 파일을 생성하는 도구를 제공합니다. Windows 런타임에는 C# 클래스 라이브러리보다 코드에 대한 제약 조건을 더 많이 가지며 C#/WinRT 진단 스캐너는 .winmd 파일을 생성하기 전에 이에 대해 경고합니다.

이 문서에서는 C#/WinRT의 빌드에서 보고된 오류에 대해 설명합니다. 이 문서에서는 Winmdexp.exe 도구를 사용하는 기존 UWP .NET 네이티브 관리형 구성 요소에 대한 제한 사항에 대한 정보를 업데이트된 버전으로 사용합니다.

오류 메시지 텍스트(자리 표시자에 대한 특정 값 생략) 또는 메시지 번호를 검색합니다. 여기에서 필요한 정보를 찾지 못한 경우 이 문서 마지막에 있는 피드백 단추를 사용하여 이 설명서를 개선하는 데 도움을 줄 수 있습니다. 사용자 의견에 오류 메시지를 포함하세요. 또는 C#/WinRT 리포지토리에서 버그를 보고할 수 있습니다.

이 문서에서는 시나리오별로 오류 메시지를 구성합니다.

유효한 Windows 런타임 인터페이스가 아닌 인터페이스 구현

C#/WinRT 구성 요소는 비동기 작업(IAsyncAction, IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult> 또는 IAsyncOperationWithProgress<TResult,TProgress>)을 나타내는 Windows 런타임 인터페이스와 같은 특정 Windows 런타임 인터페이스를 구현할 수 없습니다. 대신 Windows 런타임 구성 요소에서 비동기 작업을 생성하기 위해 AsyncInfo 클래스를 제공합니다. 참고: 이러한 인터페이스는 올바르지 않습니다. 예를 들어 클래스는 System.Exception을 구현할 수 없습니다.

오류 번호

메시지 텍스트

CsWinRT1008

인터페이스가 올바른 Windows 런타임 인터페이스가 아니므로 Windows 런타임 구성 요소 형식 {0}에서 인터페이스 {1}를 구현할 수 없습니다.

Windows 런타임에서 오버로드된 메서드는 하나의 오버로드가 기본 오버로드로 지정된 경우에만 동일한 수의 매개 변수를 사용할 수 있습니다. Windows.Foundation.Metadata.DefaultOverload(CsWinRT1015, 1016) 특성을 사용합니다.

배열이 함수나 속성 중 하나에서 입력 또는 출력으로 사용되는 경우에는 읽기 전용이거나 쓰기 전용(CsWinRT 1025)이어야 합니다. System.Runtime.InteropServices.WindowsRuntime.ReadOnlyArraySystem.Runtime.InteropServices.WindowsRuntime.WriteOnlyArray 특성을 사용할 수 있도록 제공합니다. 제공된 특성은 배열 형식(CsWinRT1026)의 매개 변수에만 사용할 수 있으며, 매개 변수(CsWinRT1023)당 하나만 적용해야 합니다.

쓰기 전용으로 간주되므로 out으로 표시된 배열 매개 변수에는 특성을 적용할 필요가 없습니다. 이 경우(CsWinRT1024) 읽기 전용으로 데코레이션하면 오류 메시지가 표시됩니다.

System.Runtime.InteropServices.InAttributeSystem.Runtime.InteropServices.OutAttribute 특성은 모든 형식의 매개 변수(CsWinRT1021,1022)에 사용하면 안 됩니다.

오류 번호

메시지 텍스트

CsWinRT1015

클래스 {2}에서: '{0}'의 다중 {1} 매개 변수 오버로드는 Windows.Foundation.Metadata.DefaultOverloadAttribute로 데코레이팅되었습니다. 특성은 메서드의 오버로드 하나에만 적용할 수 있습니다.

CsWinRT1016

클래스 {2}에서: {1}의 {0} 매개 변수 오버로드에는 Windows.Foundation.Metadata.DefaultOverloadAttribute 특성으로 데코레이팅하여 기본 오버로드로 지정된 메서드가 정확히 하나만 있어야 합니다.

CsWinRT1021

'{0}' 메서드의 '{1}' 매개 변수가 System.Runtime.InteropServices.InAttribute 또는 System.Runtime.InteropServices.OutAttribute를 갖는 배열입니다. Windows 런타임에서 배열 매개 변수에는 ReadOnlyArray 또는 WriteOnlyArray가 있어야 합니다. 필요한 경우 이러한 특성을 제거하거나 적절한 Windows 런타임 특성으로 바꾸세요.

CsWinRT1022

'{0}' 메서드의 '{1}' 매개 변수는 System.Runtime.InteropServices.InAttribute 또는 System.Runtime.InteropServices.OutAttribute입니다. Windows 런타임은 System.Runtime.InteropServices.InAttribute 또는 System.Runtime.InteropServices.OutAttribute로 매개 변수 표시를 지원하지 않습니다. 대신 System.Runtime.InteropServices.InAttribute를 제거하고 System.Runtime.InteropServices.OutAttribute는 'out' 한정자로 바꾸세요.

CsWinRT1023

'{0}' 메서드의 '{1}' 매개 변수가 배열이고 ReadOnlyArray 및 WriteOnlyArray가 모두 있습니다. Windows 런타임에서 배열 매개 변수의 내용은 읽기 가능하거나 쓰기 가능해야 합니다. '{1}'에서 두 특성 중 하나를 제거하세요.

CsWinRT1024

'{0}' 메서드의 출력 매개 변수 '{1}'가 배열이지만 ReadOnlyArray 특성이 있습니다. Windows 런타임에서는 출력 배열의 내용이 쓰기 가능해야 합니다. '{1}'에서 이 특성을 제거하세요.

CsWinRT1025

'{0}' 메서드의 '{1}' 매개 변수가 배열입니다. Windows 런타임에서 배열 매개 변수의 내용은 읽기 가능하거나 쓰기 가능해야 합니다. {1}에 ReadOnlyArray 또는 WriteOnlyArray를 적용하세요.

CsWinRT1026

'{0}' 메서드의 '{1}' 매개 변수는 배열이 아니고 ReadOnlyArray 특성 또는 WriteOnlyArray 특성이 있습니다. Windows 런타임에서는 배열이 아닌 매개 변수를 ReadOnlyArray 또는 WriteOnlyArray로 표시할 수 없습니다."

네임스페이스 오류 및 출력 파일 이름 오류

Windows 런타임에서는 Windows 메타데이터(.winmd) 파일의 모든 공용 형식이 .winmd 파일 이름을 공유하는 네임스페이스에 있거나 해당 파일 이름의 하위 네임스페이스에 있어야 합니다. 예를 들어 Visual Studio 프로젝트의 이름이 A.B(즉, Windows 런타임 구성 요소가 A.B.winmd)인 경우 공용 클래스 A.B.Class1 및 A.B.C.Class2는 포함될 수 있지만 A.Class3 또는 D.Class4는 포함될 수 없습니다.

참고 항목

이러한 제한 사항은 공용 형식에만 적용되며 구현에 사용되는 전용 형식에는 적용되지 않습니다.

A.Class3의 경우 Class3을 다른 네임스페이스로 이동하거나 Windows 런타임 구성 요소의 이름을 A.winmd로 변경합니다. 앞의 예제에서 A.B.winmd를 호출하는 코드는 A.Class3을 찾을 수 없습니다.

D.Class4의 경우 D.Class4와 A.B 네임스페이스의 클래스를 모두 포함할 수 있는 파일 이름은 없으므로 Windows 런타임 구성 요소의 이름을 변경하는 것이 불가능합니다. D.Class4를 다른 네임스페이스로 이동하거나 다른 Windows 런타임 구성 요소에 넣을 수 있습니다.

파일 시스템은 대/소문자를 구분할 수 없으므로 대/소문자만 다른 네임스페이스는 허용되지 않습니다(CsWinRT1002).

오류 번호

메시지 텍스트

CsWinRT1001

공용 형식에 다른 네임스페이스('{0}')와 공통 접두사를 공유하지 않는 네임스페이스('{1}')가 있습니다. Windows 메타데이터 파일 내의 모든 형식은 파일 이름이 암시하는 네임스페이스의 하위 네임스페이스에 있어야 합니다.

CsWinRT1002

이름이 '{0}'인 네임스페이스를 여러 개 찾았습니다. 네임스페이스 이름은 Windows 런타임에서 대/소문자만 다를 수 없습니다.

유효한 Windows 런타임 형식이 아닌 형식 내보내기

구성 요소의 공용 인터페이스는 Windows 형식만 노출해야 합니다. 그러나 .NET에서는 .NET 및 Windows 런타임에서 약간 다른 일반적으로 사용되는 여러 형식에 대한 매핑을 제공합니다. 따라서 .NET 개발자는 새 형식을 학습할 필요 없이 친숙한 형식을 사용하여 작업할 수 있습니다. 이렇게 매핑된 .NET Framework 형식을 구성 요소의 공용 인터페이스에서 사용할 수 있습니다. 자세한 내용은 Windows 런타임 구성 요소의 형식 선언, 관리 코드에 Windows 런타임 형식 전달Windows 런타임 형식의 .NET 매핑을 참조하세요.

이러한 매핑의 상당수는 인터페이스입니다. 예를 들어 IList<T>는 Windows 인터페이스 IVector<T>에 매핑됩니다. IList<string> 대신 List<string>을 매개 변수 형식으로 사용하는 경우 C#/WinRT는 List<T>에 의해 구현되는 매핑된 모든 인터페이스가 포함된 대체 목록을 제공합니다. List<Dictionary<int, string>>과 같은 중첩된 제네릭 형식을 사용하는 경우 C#/WinRT는 각 중첩 수준에 대해 선택 항목을 제공합니다. 이러한 목록은 상당히 길어질 수 있습니다.

대개 최선의 선택은 해당 형식과 가장 가까운 인터페이스입니다. 예를 들어, Dictionary<int, string>의 경우 최선의 선택은 IDictionary<int, string>일 가능성이 높습니다.

오류 번호

메시지 텍스트

CsWinRT1006

'{0}' 멤버의 서명에 '{1}' 형식이 있습니다. '{1}' 형식은 올바른 Windows 런타임 형식이 아닙니다. 그러나 형식(또는 제네릭 매개 변수)은 유효한 Windows 런타임 형식인 인터페이스를 구현합니다. 멤버 서명의 '{1}' 형식을 System.Collections.Generic에서 {2} 형식 중 하나로 변경하세요.

Windows 런타임에서 멤버 서명의 배열은 하한이 0인 1차원 배열이어야 합니다. myArray[][](CsWinRT1017) 및 myArray[,](CsWinRT1018)와 같은 중첩 배열은 허용되지 않습니다.

참고 항목

이 제한 사항은 구현에서 내부적으로 사용하는 배열에는 적용되지 않습니다.

오류 번호

메시지 텍스트

CsWinRT1017

'{0}' 메서드의 서명에 '{1}' 형식의 중첩 배열이 있습니다. Windows 런타임 메서드 서명의 배열은 중첩될 수 없습니다.

CsWinRT1018

'{0}' 메서드의 서명에 '{1}' 형식의 다차원 배열이 있습니다. Windows 런타임 메서드 시그니처의 배열은 1차원이어야 합니다.

허용되지 않는 형식의 필드가 포함된 구조체

Windows 런타임에서 구조체는 필드만 포함할 수 있으며 필드는 구조체에만 포함될 수 있습니다. 해당 필드는 공용이어야 합니다. 유효한 필드 형식에는 열거형, 구조체 및 기본 형식 등이 있습니다.

오류 번호

메시지 텍스트

CsWinRT1007

구조체 {0}에는 공용 필드가 없습니다. Windows 런타임 구조체에는 하나 이상의 공용 필드가 포함되어야 합니다.

CsWinRT1011

구조체 {0}에는 비공용 필드가 있습니다. Windows 런타임 구조체의 모든 필드는 공용이어야 합니다.

CsWinRT1012

구조체 {0}에는 const 필드가 있습니다. 상수는 Windows 런타임 열거형에만 나타날 수 있습니다.

CsWinRT1013

구조체 {0}에는 {1} 형식의 필드가 있습니다. {1}은 올바른 Windows 런타임 필드 형식이 아닙니다. Windows 런타임 구조체의 각 필드는 UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Boolean, String 또는 Enum이거나 필드 자체가 구조체여야 합니다.

매개 변수 이름이 생성된 코드와 충돌합니다.

Windows 런타임에서 반환 값은 출력 매개 변수로 간주되고, 매개 변수 이름은 고유해야 합니다. 기본적으로 C#/WinRT는 반환 값에 __retval라는 이름을 제공합니다. 메서드에 __retval라는 매개 변수가 있으면 CsWinRT1010 오류가 발생합니다. 이를 해결하려면 매개 변수에 __retvalue 이외의 이름을 지정합니다.

오류 번호

메시지 텍스트

CsWinRT1010

{0} 메서드의 매개 변수 이름 {1}은 생성된 C#/WinRT interop에서 사용되는 반환 값 매개 변수 이름과 동일합니다. 다른 매개 변수 이름을 사용합니다.

기타

C#/WinRT로 작성된 구성 요소에는 다음과 같은 기타 제한 사항이 있습니다.

  • 공용 형식에서는 오버로드된 연산자를 노출할 수 없습니다.
  • 클래스와 인터페이스는 제네릭일 수 없습니다.
  • 클래스는 봉인되어야 합니다.
  • 매개 변수를 참조로 전달할 수 없습니다. 예를 들어 ref 키워드를 사용합니다.
  • 속성에는 public get 메서드가 있어야 합니다.
  • 구성 요소 네임스페이스에는 하나 이상의 public 형식(클래스 또는 인터페이스)이 있어야 합니다.

오류 번호

메시지 텍스트

CsWinRT1014

'{0}'은 연산자 오버로드입니다. 관리 형식은 Windows 런타임에서 연산자 오버로드를 노출할 수 없습니다.

CsWinRT1004

{0} 형식은 제네릭입니다. Windows 런타임 형식은 제네릭일 수 없습니다.

CsWinRT1005

봉인되지 않은 형식 내보내기는 CsWinRT에서 지원되지 않습니다. {0} 형식을 봉인됨으로 표시하세요.

CsWinRT1020

'{0}' 메서드에 `ref`로 표시된 '{1}' 매개 변수가 있습니다. Windows 런타임에서는 참조 매개 변수를 사용할 수 없습니다.

CsWinRT1000

'{0}' 속성에 public getter 메서드가 없습니다. Windows 런타임은 setter 전용 속성을 지원하지 않습니다.

CsWinRT1003

Windows 런타임 구성 요소에는 public 형식이 하나 이상 있어야 합니다.

Windows 런타임에서 클래스는 지정된 수의 매개 변수를 가진 생성자를 하나만 포함할 수 있습니다. 예를 들어 String 형식의 단일 매개 변수를 사용하는 생성자와 int형식의 단일 매개 변수를 사용하는 생성자를 동시에 가질 수 없습니다. 유일한 해결 방법은 각 생성자에 대해 다른 수의 매개 변수를 사용하는 것입니다.

오류 번호

메시지 텍스트

CsWinRT1009

클래스에는 Windows 런타임에 있는 동일한 인자 수의 생성자가 여러 개 있을 수 없으며 {0} 클래스에는 다중 {1}-arity 생성자가 있습니다.