Windows Runtime 구성 요소 오류 조건 진단
이 문서에서는 관리 코드로 작성된 Windows 런타임 구성 요소의 제한 사항에 대한 추가 정보를 제공합니다. Winmdexp.exe(Windows Runtime 메타데이터 내보내기 도구)에서 보내는 오류 메시지에 제공되는 정보에 대해 설명하고 C# 및 Visual Basic으로 Windows Runtime 구성 요소 만들기에서 제공하는 제한 사항에 대한 정보에 대해서도 더 자세히 알아봅니다.
이 문서는 모든 오류에 대해 설명하지 않습니다. 여기서 설명하는 오류는 일반적인 범주로 묶여 있으며 각 범주에는 관련 오류 메시지 목록이 포함되어 있습니다. 자리 표시자로 사용되는 특정 값을 생략하고 메시지 텍스트로 검색하거나 메시지 번호로 검색하세요. 여기에 필요한 정보가 없으면 문서를 개선할 수 있도록 문서 맨 끝에 있는 피드백 단추를 사용해 주십시오. 피드백을 보낼 때는 오류 메시지를 포함해 주십시오. Microsoft Connect 웹 사이트에서 버그를 보고할 수도 있습니다.
이 문서는 다음 단원으로 구성됩니다.
비동기 패턴을 구현할 때 오류 메시지에서 잘못된 형식 제공
mscorlib.dll 및/또는 System.Runtime.dll에 대한 참조 누락
연산자 오버로딩은 허용되지 않음
클래스 생성자의 매개 변수 수가 같음
매개 변수 수가 같은 오버로드의 경우 기본값을 지정해야 함
네임스페이스 오류 및 출력 파일 이름 오류
유효한 Windows Runtime 형식이 아닌 형식 내보내기
허용되지 않는 형식의 필드가 포함된 구조체
멤버 시그니처에 있는 배열에 대한 제한 사항
배열 매개 변수는 배열 내용이 읽기 가능인지 또는 쓰기 가능인지 지정해야 함
매개 변수 이름이 "value"인 멤버
비동기 인터페이스 구현에 대한 오류 메시지에서 잘못된 형식 제공
관리되는 Windows 런타임 구성 요소는 비동기 작업(IAsyncAction, IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult> 또는 IAsyncOperationWithProgress<TResult, TProgress>)을 나타내는 Windows 런타임 인터페이스를 구현할 수 없습니다. 대신 .NET Framework가 Windows 런타임 구성 요소에서 비동기 작업을 생성하는 AsyncInfo 클래스를 제공합니다. 비동기 인터페이스를 구현할 때 Winmdexp.exe에서 표시하는 오류 메시지가 이 클래스를 이전 이름인 AsyncInfoFactory로 잘못 참조합니다. 이제 .NET Framework에는 AsyncInfoFactory 클래스가 없습니다.
오류 번호 |
메시지 텍스트 |
---|---|
WME1084 |
'{0}' 형식이 Windows Runtime 비동기 인터페이스 ''{1}'을(를) 구현합니다. Windows Runtime 형식은 비동기 인터페이스를 구현할 수 없습니다. System.Runtime.InteropServices.WindowsRuntime.AsyncInfoFactory 클래스를 사용하여 Windows Runtime으로 내보내기 위한 비동기 작업을 생성하십시오. |
mscorlib.dll 또는 System.Runtime.dll에 대한 참조 누락
이 문제는 명령줄에서 Winmdexp.exe를 사용하는 경우에만 발생합니다. /reference 옵션을 사용하여 "%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5"(32비트 컴퓨터의 경우 "%ProgramFiles%\...")에 있는 .NET Framework 핵심 참조 어셈블리의 mscorlib.dll 및 System.Runtime.dll에 대한 참조를 포함하는 것이 좋습니다.
오류 번호 |
메시지 텍스트 |
---|---|
WME1009 |
mscorlib.dll을 참조하지 않았습니다. 올바르게 내보내려면 이 메타데이터 파일에 대한 참조가 필요합니다. |
WME1090 |
핵심 참조 어셈블리를 확인할 수 없습니다. mscorlib.dll과 System.Runtime.dll이 /reference 스위치를 사용하여 참조되는지 확인하세요. |
연산자 오버로딩은 허용되지 않음
관리 코드로 작성된 Windows 런타임 구성 요소에서는 공용 형식에 오버로드된 연산자를 노출할 수 없습니다.
참고
오류 메시지에서 연산자는 op_Addition, op_Multiply, op_ExclusiveOr, op_Implicit(암시적 변환)와 같은 메타데이터 이름으로 식별됩니다.
오류 번호 |
메시지 텍스트 |
---|---|
WME1087 |
'{0}'은(는) 연산자 오버로드입니다. Windows 런타임에서는 관리되는 형식이 연산자 오버로드를 노출할 수 없습니다. |
클래스 생성자의 매개 변수 수가 같음
Windows 런타임에서 클래스 생성자의 매개 변수 수는 모두 달라야 합니다. 예를 들어 String 형식의 단일 매개 변수를 사용하는 생성자와 int(Visual Basic에서는 Integer) 형식의 단일 매개 변수를 사용하는 생성자를 동시에 가질 수 없습니다. 이 문제를 해결하는 방법은 생성자마다 다른 개수의 매개 변수를 사용하는 방법 뿐입니다.
오류 번호 |
메시지 텍스트 |
---|---|
WME1099 |
'{0}' 형식에 '{1}' 인수를 사용하는 생성자가 여러 개 있습니다. Windows 런타임 형식에는 동일한 수의 인수를 사용하는 생성자가 여러 개 있을 수 없습니다. |
매개 변수 수가 같은 오버로드의 경우 기본값을 지정해야 함
Windows 런타임에서 오버로드된 메서드는 하나의 오버로드가 기본 오버로드로 지정된 경우에만 동일한 수의 매개 변수를 가질 수 있습니다. C# 및 Visual Basic으로 Windows Runtime 구성 요소 만들기의 "오버로드된 메서드"를 참조하십시오.
오류 번호 |
메시지 텍스트 |
---|---|
WME1059 |
'{1}.{2}'의 {0} 매개 변수 오버로드 여러 개가 Windows.Foundation.Metadata.DefaultOverloadAttribute로 데코레이팅되었습니다. |
WME1085 |
{1}.{2}의 {0} 매개 변수 오버로드에는 Windows.Foundation.Metadata.DefaultOverloadAttribute로 데코레이팅하여 기본 오버로드로 지정된 메서드가 정확히 하나만 있어야 합니다. |
네임스페이스 오류 및 출력 파일 이름 오류
Windows 런타임에서는 Windows 메타데이터(.winmd) 파일의 모든 공용 형식이 .winmd 파일 이름을 공유하는 네임스페이스에 있거나 해당 파일 이름의 하위 네임스페이스에 있어야 합니다. 예를 들어 Visual Studio 2012 프로젝트의 이름이 A.B(즉, Windows 런타임 구성 요소가 A.B.winmd)인 경우 공용 클래스 A.B.Class1 및 A.B.C.Class2는 포함될 수 있지만 A.Class3(WME0006) 또는 D.Class4(WME1044)는 포함될 수 없습니다.
참고
이러한 제한 사항은 공용 형식에만 적용되며 구현에 사용되는 전용 형식에는 적용되지 않습니다.
A.Class3의 경우 Class3을 다른 네임스페이스로 이동하거나 Windows 런타임 구성 요소의 이름을 A.winmd로 변경합니다. WME0006은 경고 메시지이지만 오류로 간주해야 합니다. 앞의 예제에서 A.B.winmd를 호출하는 코드는 A.Class3을 찾을 수 없습니다.
D.Class4의 경우 D.Class4와 A.B 네임스페이스의 클래스를 모두 포함할 수 있는 파일 이름은 없으므로 Windows 런타임 구성 요소의 이름을 변경하는 것이 불가능합니다. D.Class4를 다른 네임스페이스로 이동하거나 다른 Windows 런타임 구성 요소에 배치하세요.
파일 시스템은 대/소문자를 구분할 수 없으므로 대/소문자만 다른 네임스페이스는 허용되지 않습니다(WME1067).
구성 요소는 하나 이상의 public sealed 형식(Visual Basic에서는 Public NotInheritable)을 포함하고 있어야 합니다. 그렇지 않으면 구성 요소에 전용 형식이 포함되어 있는지 여부에 따라 WME1042 또는 WME1043이 발생합니다.
Windows 런타임 구성 요소의 형식은 네임스페이스와 동일한 이름을 사용할 수 없습니다(WME1068).
경고
Winmdexp.exe를 직접 호출할 때 /out 옵션을 사용하여 Windows 런타임 구성 요소의 이름을 지정하지 않으면 Winmdexp.exe는 구성 요소의 모든 네임스페이스를 포함하는 이름을 생성하려고 시도합니다.네임스페이스의 이름을 바꾸면 구성 요소의 이름도 변경될 수 있습니다.
오류 번호 |
메시지 텍스트 |
---|---|
WME0006 |
'{0}'은(는) 이 어셈블리에 올바른 winmd 파일 이름이 아닙니다. Windows 메타데이터 파일 내의 모든 형식은 파일 이름이 암시하는 네임스페이스의 하위 네임스페이스에 있어야 합니다. 이러한 하위 네임스페이스에 없는 형식은 런타임에 찾을 수 없습니다. 이 어셈블리에서 파일 이름으로 사용될 수 있는 가장 작은 공통 네임스페이스는 '{1}'입니다. |
WME1042 |
입력 모듈에는 네임스페이스 내에 있는 공용 형식이 하나 이상 포함되어야 합니다. |
WME1043 |
입력 모듈에는 네임스페이스 내에 있는 공용 형식이 하나 이상 포함되어야 합니다. 네임스페이스 내에서 발견된 유일한 형식은 전용 형식입니다. |
WME1044 |
공용 형식에 다른 네임스페이스('{0}')와 공통 접두사를 공유하지 않는 네임스페이스('{1}')가 있습니다. Windows 메타데이터 파일 내의 모든 형식은 파일 이름이 암시하는 네임스페이스의 하위 네임스페이스에 있어야 합니다. |
WME1067 |
대/소문자만 다른 네임스페이스 이름 '{0}', '{1}'을(를) 지정할 수 없습니다. |
WME1068 |
'{0}' 형식에는 '{1}' 네임스페이스와 같은 이름을 사용할 수 없습니다. |
유효한 Windows 런타임 형식이 아닌 형식 내보내기
구성 요소의 공용 인터페이스는 Windows 런타임 형식만 내보내야 합니다. 하지만 .NET Framework는 일반적으로 사용되는 형식이면서 .NET Framework와 Windows 런타임에서 조금만 다른 여러 형식에 대한 매핑을 제공합니다. 따라서 .NET Framework 개발자는 새로운 형식을 배울 필요 없이 익숙한 형식을 사용할 수 있습니다. 이렇게 매핑된 .NET Framework 형식을 구성 요소의 공용 인터페이스에서 사용할 수 있습니다. C# 및 Visual Basic으로 Windows Runtime 구성 요소 만들기의 "Windows 런타임 구성 요소에서 형식 선언" 및 "관리 코드에 Windows 런타임 형식 전달"과 Windows Runtime 형식의 .NET Framework 매핑을 참조하십시오.
이러한 매핑의 상당수는 인터페이스입니다. 예를 들어, IList<T>는 Windows 런타임 인터페이스 IVector<T>에 매핑됩니다. 매개 변수 형식으로 IList<string> 대신 List<string>(Visual Basic에서는 List(Of String))을 사용하는 경우 Winmdexp.exe는 List<T>이 구현하는 매핑된 인터페이스가 모두 들어 있는 대체 목록을 제공합니다. List<Dictionary<int, string>>(Visual Basic에서는 List(Of Dictionary(Of Integer, String)))과 같은 중첩된 제네릭 형식을 사용하는 경우 Winmdexp.exe는 각 중첩 수준에 대해 선택 항목을 제공합니다. 이러한 목록은 상당히 길어질 수 있습니다.
대개 최선의 선택은 해당 형식과 가장 가까운 인터페이스입니다. 예를 들어 Dictionary<int, string>의 경우 최선의 선택은 IDictionary<int, string>일 가능성이 놓습니다.
중요
JavaScript는 관리되는 형식이 구현하는 인터페이스 목록에 첫 번째로 표시되는 인터페이스를 사용합니다.+예를 들어 JavaScript 코드에 Dictionary<int, string>을 반환하는 경우 사용자가 반환 형식으로 지정하는 인터페이스에 관계없이 반환 형식은 IDictionary<int, string>으로 나타납니다.즉 첫 번째 인터페이스가 나머지 인터페이스에 나타나는 멤버를 포함하고 있지 않은 경우 해당 멤버는 JavaScript에 표시되지 않습니다.
경고
JavaScript에서 사용될 구성 요소인 경우 제네릭이 아닌 IList 및 IEnumerable 인터페이스를 사용하지 마십시오.이러한 인터페이스는 각각 IBindableVector 및 IBindableIterator에 매핑됩니다.이들은 XAML 컨트롤에 대한 바인딩을 지원하며 JavaScript에 표시되지 않습니다.JavaScript에서는 "'X' 함수의 시그니처가 잘못되었으므로 호출할 수 없습니다."라는 런타임 오류가 발생합니다.
오류 번호 |
메시지 텍스트 |
---|---|
WME1033 |
'{0}' 메서드에 '{2}' 형식의 '{1}' 매개 변수가 있습니다. '{2}'은(는) 올바른 Windows Runtime 매개 변수 형식이 아닙니다. |
WME1038 |
'{0}' 메서드의 시그니처에 '{1}' 형식의 매개 변수가 있습니다. 이 형식은 올바른 Windows Runtime 형식이 아니지만 올바른 Windows Runtime 형식인 인터페이스를 구현합니다. 메서드 시그니처를 다음 형식 중 하나를 사용하도록 변경하세요. '{2}'. |
WME1039 |
'{0}' 메서드의 시그니처에 '{1}' 형식의 매개 변수가 있습니다. 이 제네릭 형식은 올바른 Windows Runtime 형식이 아니지만 해당 형식이나 형식의 제네릭 매개 변수가 올바른 Windows Runtime 형식인 인터페이스를 구현합니다. {2}
참고
{2}의 경우 Winmdexp.exe는 "메서드 시그니처의 'System.Collections.Generic.List<T>' 형식을 'System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.Generic.IEnumerable<T>' 중 하나로 변경하세요."와 같이 대체 목록을 추가합니다.
|
WME1040 |
'{0}' 메서드의 시그니처에 '{1}' 형식의 매개 변수가 있습니다. 관리되는 Task 형식을 사용하는 대신 Windows.Foundation.IAsyncAction, Windows.Foundation.IAsyncOperation 또는 다른 Windows 런타임 비동기 인터페이스 중 하나를 사용하세요. 또한 이러한 인터페이스에는 표준 .NET await 패턴이 적용됩니다. 관리되는 작업 개체를 Windows 런타임 비동기 인터페이스로 변환하는 방법에 대한 자세한 내용은 System.Runtime.InteropServices.WindowsRuntime.AsyncInfo를 참조하십시오. |
허용되지 않는 형식의 필드가 포함된 구조체
Windows 런타임에서 구조체는 필드만 포함할 수 있으며 필드는 구조체에만 포함될 수 있습니다. 해당 필드는 공용이어야 합니다. 유효한 필드 형식에는 열거형, 구조체 및 기본 형식 등이 있습니다.
오류 번호 |
메시지 텍스트 |
---|---|
WME1060 |
'{0}' 구조체에 '{2}' 형식의 '{1}' 필드가 있습니다. '{2}'은(는) 올바른 Windows Runtime 필드 형식이 아닙니다. Windows Runtime 구조체의 각 필드는 UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Boolean, String 또는 Enum이거나 필드 자체가 구조체여야 합니다. |
멤버 시그니처에 있는 배열에 대한 제한 사항
Windows 런타임에서 멤버 시그니처의 배열은 하한이 0인 1차원 배열이어야 합니다. myArray[][](Visual Basic에서는 myArray()())와 같은 중첩된 배열은 허용되지 않습니다.
참고
이 제한 사항은 구현에서 내부적으로 사용하는 배열에는 적용되지 않습니다.
오류 번호 |
메시지 텍스트 |
---|---|
WME1034 |
'{0}' 메서드의 시그니처에 하한이 0이 아닌 '{1}' 형식의 배열이 있습니다. Windows 런타임 메서드 시그니처의 배열은 하한이 0이어야 합니다. |
WME1035 |
'{0}' 메서드의 시그니처에 '{1}' 형식의 다차원 배열이 있습니다. Windows 런타임 메서드 시그니처의 배열은 1차원이어야 합니다. |
WME1036 |
'{0}' 메서드의 시그니처에 '{1}' 형식의 중첩 배열이 있습니다. Windows 런타임 메서드 시그니처의 배열은 중첩될 수 없습니다. |
배열 매개 변수는 배열 내용이 읽기 가능인지 또는 쓰기 가능인지 지정해야 함
Windows 런타임에서 매개 변수는 읽기 전용이거나 쓰기 전용이어야 합니다. 매개 변수는 ref(Visual Basic에서는 OutAttribute 특성이 지정되지 않은 ByRef)로 표시될 수 없습니다. 이 제한 사항은 배열의 내용에 적용되므로 배열 매개 변수는 배열 내용이 읽기 전용인지 쓰기 전용인지 표시해야 합니다. out 매개 변수(Visual Basic에서는 OutAttribute 특성이 지정된 ByRef 매개 변수)인 경우에는 방향이 명확하지만 값(Visual Basic에서는 ByVal)으로 전달되는 배열 매개 변수인 경우에는 반드시 표시가 필요합니다. Windows Runtime 구성 요소에 배열 전달을 참조하십시오.
오류 번호 |
메시지 텍스트 |
---|---|
WME1101 |
'{0}' 메서드의 '{1}' 매개 변수가 배열이고 {2} 및 {3}이(가) 모두 있습니다. Windows Runtime에서 배열 매개 변수의 내용은 읽기 가능하거나 쓰기 가능해야 합니다. '{1}'에서 두 특성 중 하나를 제거하세요. |
WME1102 |
'{0}' 메서드의 출력 매개 변수 '{1}'이(가) 배열이지만 {2}이(가) 있습니다. Windows Runtime에서는 출력 배열의 내용이 쓰기 가능해야 합니다. '{1}'에서 이 특성을 제거하세요. |
WME1103 |
'{0}' 메서드의 '{1}' 매개 변수가 System.Runtime.InteropServices.InAttribute 또는 System.Runtime.InteropServices.OutAttribute를 갖는 배열입니다. Windows Runtime에서 배열 매개 변수는 {2} 또는 {3}을(를) 가져야 합니다. 필요한 경우 이러한 특성을 제거하거나 적절한 Windows Runtime 특성으로 바꾸십시오. |
WME1104 |
'{0}' 메서드의 '{1}' 매개 변수가 배열이 아니고 {2} 또는 {3}이(가) 있습니다. Windows Runtime에서는 배열이 아닌 매개 변수를 {2} 또는 {3}(으)로 표시할 수 없습니다. |
WME1105 |
'{0}' 메서드에 System.Runtime.InteropServices.InAttribute 또는 System.Runtime.InteropServices.OutAttribute를 갖는 '{1}' 매개 변수가 있습니다. Windows Runtime에서는 System.Runtime.InteropServices.InAttribute 또는 System.Runtime.InteropServices.OutAttribute로 매개 변수를 표시할 수 없습니다. 대신 System.Runtime.InteropServices.InAttribute를 제거하고 System.Runtime.InteropServices.OutAttribute는 'out' 한정자로 바꾸십시오. '{0}' 메서드에 System.Runtime.InteropServices.InAttribute 또는 System.Runtime.InteropServices.OutAttribute를 갖는 '{1}' 매개 변수가 있습니다. Windows Runtime에서는 ByRef 매개 변수를 System.Runtime.InteropServices.OutAttribute로 표시할 수만 있고 다른 특성 사용법은 지원되지 않습니다. |
WME1106 |
'{0}' 메서드의 '{1}' 매개 변수가 배열입니다. Windows Runtime에서 배열 매개 변수의 내용은 읽기 가능하거나 쓰기 가능해야 합니다. '{1}'에 {2} 또는 {3}을(를) 적용하세요. |
매개 변수 이름이 "value"인 멤버
Windows 런타임에서 반환 값은 출력 매개 변수로 간주되고, 매개 변수 이름은 고유해야 합니다. 기본적으로 Winmdexp.exe는 반환 값의 이름을 "value"로 지정합니다. 메서드의 매개 변수 이름이 "value"인 경우 WME1092 오류가 발생합니다. 다음과 같은 두 가지 방법으로 이 문제를 해결할 수 있습니다.
매개 변수의 이름을 "value" 이외의 이름으로 지정합니다. 속성 접근자의 경우 "returnValue" 이외의 이름으로 지정합니다.
ReturnValueNameAttribute 특성을 사용하여 다음과 같이 반환 값의 이름을 변경합니다.
using System.Runtime.InteropServices; using System.Runtime.InteropServices.WindowsRuntime; [return: ReturnValueName("average")] public int GetAverage(out int lowValue, out int highValue)
Imports System.Runtime.InteropServices Imports System.Runtime.InteropServices.WindowsRuntime Public Function GetAverage(<Out> ByRef lowValue As Integer, _ <Out> ByRef highValue As Integer) As <ReturnValueName("average")> String
참고
반환 값의 이름을 변경했는데 새 이름이 다른 매개 변수 이름과 충돌하면 WME1091 오류가 발생합니다.
JavaScript 코드는 반환 값을 포함하여 메서드의 출력 매개 변수를 이름으로 액세스할 수 있습니다. 예제를 보려면 ReturnValueNameAttribute 특성을 참조하십시오.
오류 번호 |
메시지 텍스트 |
---|---|
WME1091 |
'{0}' 메서드의 반환 값 이름 '{1}'이(가) 매개 변수 이름과 동일합니다. Windows Runtime 메서드의 매개 변수와 반환 값에는 고유한 이름이 있어야 합니다. |
WME1092 |
'{0}' 메서드의 매개 변수 이름 '{1}'이(가) 기본 반환 값 이름과 동일합니다. 매개 변수에 다른 이름을 사용하는 것을 고려하거나 System.Runtime.InteropServices.WindowsRuntime.ReturnValueNameAttribute를 사용하여 반환 값의 이름을 명시적으로 지정하세요.
참고
속성 접근자의 경우에만 기본 이름이 "returnValue"입니다. 다른 메서드의 기본 이름은 모두 "value"입니다.
|
참고 항목
참조
Winmdexp.exe(Windows Runtime 메타데이터 내보내기 도구)