Windows 8.x 앱을 .NET 네이티브로 마이그레이션
.NET 네이티브는 Microsoft Store 또는 개발자 컴퓨터에서 앱의 정적 컴파일을 제공합니다. 이는 JIT(Just-In-Time) 컴파일러 또는 네이티브 이미지 생성기(Ngen.exe)가 Windows 8.x 앱(이전에는 Microsoft Store 앱이라고도 함)에 대해 수행된 동적 컴파일과 다릅니다. 디바이스. 차이점에도 불구하고 .NET 네이티브는 Windows 8.x 앱용 .NET과의 호환성을 유지하려고 합니다. 대부분의 경우 Windows 8.x 앱용 .NET에서 작동하는 것은 .NET 네이티브에서도 작동합니다. 그러나 동작이 변경되는 경우도 있습니다. 이 문서에서는 다음 영역에서 표준 Windows 8.x 앱용 .NET과 .NET 네이티브 간의 이러한 차이점에 대해 설명합니다.
일반 런타임 차이점
앱이 CLR(공용 언어 런타임)에서 실행될 때 JIT 컴파일러에서 throw되는 TypeLoadException과 같은 예외는 일반적으로 .NET 네이티브에서 처리할 때 컴파일 시간 오류를 발생시킵니다.
앱 UI 스레드에서 GC.WaitForPendingFinalizers 메서드를 호출해서는 안 됩니다. 이로 인해 .NET 네이티브에서 교착 상태가 발생할 수 있습니다.
정적 클래스 생성자 호출 순서를 따라서는 안 됩니다. .NET 네이티브에서 호출 순서는 표준 런타임의 순서와 다릅니다. 표준 런타임을 사용하는 경우에도 정적 클래스 생성자 실행 순서를 따라서는 안 됩니다.
스레드에서 호출을 하지 않고 무한 루프(예:
while(true);
)를 사용하면 앱이 중지될 수 있습니다. 마찬가지로 대기 시간이 길어지거나 무한히 계속되어도 앱이 중지될 수 있습니다.특정 일반 초기화 주기는 .NET 네이티브에서 예외를 throw하지 않습니다. 예를 들어 다음 코드는 표준 CLR에서는 TypeLoadException 예외를 throw하지만 .NET 네이티브에서는 그렇지 않습니다.
using System; struct N<T> {} struct X { N<X> x; } public class Example { public static void Main() { N<int> n = new N<int>(); X x = new X(); } }
경우에 따라 .NET 네이티브는 .NET Framework 클래스 라이브러리의 다양한 구현을 제공합니다. 메서드에서 반환된 개체는 항상 반환된 형식의 멤버를 구현합니다. 그러나 지원 구현이 다르므로 기타 .NET Framework 플랫폼에서와 같이 해당 개체를 동일한 형식 집합으로 캐스팅하지 못할 수도 있습니다. 예를 들어 IEnumerable<T> , TypeInfo.DeclaredMembers 등의 메서드가 반환한 TypeInfo.DeclaredProperties 인터페이스 개체는
T[]
로 캐스팅할 수 없습니다.WinInet 캐시는 Windows 8.x 앱용 .NET에서 기본적으로 사용하도록 설정되어 있지 않지만 .NET 네이티브에는 있습니다. 이로 인해 성능은 향상되지만 작업 집합이 영향을 받습니다. 개발자가 작업을 수행할 필요는 없습니다.
동적 프로그래밍 차이점
.NET 네이티브는 .NET Framework의 코드에서 정적으로 연결되어 최대 성능을 위해 코드를 앱 로컬로 만듭니다. 그러나 이진 크기를 작게 유지해야 하므로 전체 .NET Framework의 코드를 가져올 수는 없습니다. .NET 네이티브 컴파일러는 사용하지 않는 코드에 대한 참조를 제거하는 종속성 감소기를 사용하여 이 제한을 해결합니다. 그러나 .NET 네이티브는 해당 정보가 컴파일 시간에 정적으로 유추될 수 없는 경우 일부 형식 정보 및 코드를 유지 관리하거나 생성하지 않을 수 있지만 대신 런타임에 동적으로 검색됩니다.
.NET 네이티브는 리플렉션 및 동적 프로그래밍을 가능하게 합니다. 그러나 생성된 코드 크기가 너무 커지므로(특히 .NET Framework의 공용 API에 대한 리플렉션이 지원되기 때문에) 모든 유형을 리플렉션하도록 표시할 수 있는 것은 아닙니다. .NET 네이티브 컴파일러는 리플렉션을 지원해야 하는 형식에 대해 현명한 선택을 하고 메타데이터를 유지하고 해당 형식에 대해서만 코드를 생성합니다.
예를 들어 데이터 바인딩을 사용하려면 앱이 속성 이름을 함수에 매핑할 수 있어야 합니다. Windows 8.x 앱용 .NET에서 공용 언어 런타임은 자동으로 리플렉션을 사용하여 관리되는 형식과 공개적으로 사용 가능한 네이티브 형식에 대해 이 기능을 제공합니다. .NET 네이티브에서 컴파일러는 데이터를 바인딩하는 형식에 대한 메타데이터를 자동으로 포함합니다.
.NET 네이티브 컴파일러는 힌트나 지시문 없이 작동하는 List<T> 및 Dictionary<TKey,TValue>와 같이 일반적으로 사용되는 제네릭 유형도 처리할 수 있습니다. 동적 키워드도 일정한 제한 내에서 지원됩니다.
참고 항목
앱을 .NET 네이티브로 이식할 때 모든 동적 코드 경로를 철저히 테스트해야 합니다.
.NET 네이티브의 기본 구성은 대부분의 개발자에게 충분하지만 일부 개발자는 런타임 지시문(.rd.xml) 파일을 사용하여 구성을 미세 조정할 수 있습니다. 또한 어떤 경우에는 .NET 네이티브 컴파일러가 리플렉션에 사용할 수 있어야 하는 메타데이터를 결정할 수 없으며 특히 다음과 같은 경우 힌트에 의존합니다.
Type.MakeGenericType , MethodInfo.MakeGenericMethod 등의 일부 구문은 정적으로 확인할 수 없습니다.
컴파일러는 인스턴스화를 확인할 수 없으므로 런타임 지시문을 사용하여 리플렉션을 수행하려는 제네릭 형식을 지정해야 합니다. 이는 단순히 모든 코드를 포함해야 하기 때문이 아니라, 제네릭 형식에 대해 리플렉션을 수행하면 무한 주기가 생성될 수 있기 때문입니다(예: 제네릭 형식에 대해 제네릭 메서드를 호출하는 경우).
참고 항목
런타임 지시문은 런타임 지시문(.rd.xml) 파일에서 정의합니다. 이 파일의 사용 방법에 대한 일반 정보는 시작을 참조하세요. 런타임 지시문에 대한 자세한 내용은 Runtime Directives (rd.xml) Configuration File Reference를 참조하세요.
.NET 네이티브에는 개발자가 기본 집합 외부에서 리플렉션을 지원해야 하는 형식을 결정할 수 있도록 하는 프로파일링 도구도 포함되어 있습니다.
기타 리플렉션 관련 차이점
Windows 8.x 앱용 .NET과 .NET 네이티브 간에는 여러 가지 다른 개별 리플렉션 관련 동작 차이가 있습니다.
.NET 네이티브에서:
.NET Framework 클래스 라이브러리의 형식 및 멤버에 대한 개인 리플렉션은 지원되지 않습니다. 그러나 고유한 개인 형식과 멤버 및 타사 라이브러리의 형식과 멤버에 대해서는 리플렉션을 수행할 수 있습니다.
ParameterInfo.HasDefaultValue 속성은 반환 값을 나타내는
false
개체에 대해 ParameterInfo 를 올바르게 반환합니다. Windows 8.x 앱용 .NET에서는true
을 반환합니다. IL(중간 언어)은 이러한 반환을 직접 지원하지 않으며 해석은 언어에 따라 달라집니다.RuntimeFieldHandle 및 RuntimeMethodHandle 구조체에서는 public 멤버를 사용할 수 없습니다. 이러한 형식은 LINQ, 식 트리 및 정적 배열 초기화에서만 지원됩니다.
RuntimeReflectionExtensions.GetRuntimeProperties 및 RuntimeReflectionExtensions.GetRuntimeEvents 의 기본 클래스는 숨겨진 멤버를 포함하므로 명시적으로 재정의하지 않아도 재정의될 수 있습니다. 이는 다른 RuntimeReflectionExtensions.GetRuntime* 메서드에서도 마찬가지입니다.
Type.MakeArrayType 및 Type.MakeByRefType는 특정 조합(예:
byref
개체의 배열)을 만들려고 할 때 실패하지 않습니다.리플렉션을 사용하여 포인터 매개 변수가 있는 멤버를 호출할 수는 없습니다.
리플렉션을 사용하여 포인터 필드를 가져오거나 설정할 수는 없습니다.
인수 수가 잘못되고 인수 중 하나의 유형이 올바르지 않으면 .NET 네이티브는 TargetParameterCountException 대신 ArgumentException를 발생시킵니다.
예외의 이진 serialization은 일반적으로 지원되지 않습니다. 그러므로 serialize할 수 없는 개체를 Exception.Data 사전에 추가할 수 있습니다.
지원되지 않는 시나리오 및 API
다음 섹션에서는 일반 개발, interop 및 HTTPClient, WCF(Windows Communication Foundation) 등의 기술에 대해 지원되지 않는 시나리오와 API에 대해 설명합니다.
일반 개발 관련 차이점
값 형식
값 형식에 대해 ValueType.Equals 및 ValueType.GetHashCode 메서드를 재정의하는 경우 기본 클래스 구현을 호출하지 마세요. Windows 8.x 앱용 .NET에서 이러한 메서드는 리플렉션에 의존합니다. 컴파일 시간에 .NET 네이티브는 런타임 리플렉션에 의존하지 않는 구현을 생성합니다. 즉, 이 두 메서드를 재정의하지 않으면 .NET 네이티브가 컴파일 시간에 구현을 생성하기 때문에 예상대로 작동합니다. 그러나 이러한 메서드를 재정의하고 기본 클래스 구현을 호출하면 예외가 발생합니다.
1MB보다 큰 값 유형은 지원되지 않습니다.
값 형식은 .NET 네이티브에서 매개 변수가 없는 생성자를 가질 수 없습니다. (C# 및 Visual Basic은 값 형식에서 매개 변수 없는 생성자를 금지합니다. 그러나 IL에서는 생성자를 만들 수 있습니다.)
배열
하한이 0이 아닌 배열은 지원되지 않습니다. 이러한 배열은 대개 Array.CreateInstance(Type, Int32[], Int32[]) 오버로드를 호출하여 만듭니다.
동적으로 다차원 배열을 만들 수 없습니다. 이러한 배열은 대개 Array.CreateInstance 매개 변수를 포함하는
lengths
메서드의 오버로드 또는 Type.MakeArrayType(Int32) 메서드를 호출하여 만듭니다.차원이 4개 이상(해당 Array.Rank 속성 값이 4 이상)인 다차원 배열은 지원되지 않습니다. 이러한 경우에는 가변 배열 (배열의 배열)을 대신 사용합니다. 예를 들어
array[x,y,z]
는 유효하지 않지만array[x][y][z]
는 유효합니다.다차원 배열에는 가변성(variance)이 지원되지 않으며, 가변성(variance)을 적용하는 경우 런타임에 InvalidCastException 예외가 발생합니다.
제네릭
무한 제네릭 형식을 확장하면 컴파일러 오류가 발생합니다. 예를 들어 다음 코드는 컴파일되지 않습니다.
class A<T> {} class B<T> : A<B<A<T>>> {}
포인터
포인터 배열은 지원되지 않습니다.
리플렉션을 사용하여 포인터 필드를 가져오거나 설정할 수는 없습니다.
직렬화
KnownTypeAttribute(String) 특성은 지원되지 않습니다. 대신 KnownTypeAttribute(Type) 특성을 사용하세요.
리소스
EventSource 클래스에는 지역화된 리소스를 사용할 수 없습니다. EventSourceAttribute.LocalizationResources 속성은 지역화된 리소스를 정의하지 않습니다.
대리자
Delegate.BeginInvoke
및 Delegate.EndInvoke
는 지원되지 않습니다.
기타 API
TypeInfo.GUID 특성은 GuidAttribute 특성이 유형에 적용되지 않은 경우 PlatformNotSupportedException 예외를 발생시킵니다. GUID는 주로 COM 지원을 위해 사용됩니다.
DateTime.Parse 메서드는 .NET 네이티브에서 짧은 날짜가 포함된 문자열을 올바르게 구문 분석합니다. 그러나 날짜 및 시간 구문 분석의 특정 변경 내용과의 호환성을 유지하지 않습니다.
BigInteger.ToString
("E")
은 .NET 네이티브 올바르게 반올림됩니다. 일부 CLR 버전에서는 결과 문자열이 반올림되는 대신 잘립니다.
HttpClient의 차이점
.NET 네이티브에서 HttpClientHandler 클래스는 표준 Windows 8.x 앱용 .NET에서 사용되는 WebRequest 및 WebResponse 클래스 대신 내부적으로 WinINet(HttpBaseProtocolFilter 클래스를 통해)을 사용합니다. WinINet은 HttpClientHandler 클래스에서 지원하는 구성 옵션 중 일부만 지원합니다. 결과적으로 다음이 수행됩니다.
HttpClientHandler의 일부 기능 속성은 .NET 네이티브에서
false
를 반환하는 반면 표준 Windows 8.x 앱용 .NET에서는true
를 반환합니다.일부 구성 속성
get
접근자는 Windows 8.x 앱용 .NET의 기본 구성 값과 다른 .NET 네이티브의 고정 값을 항상 반환합니다.
다음 하위 섹션에서 몇 가지 추가적인 동작 차이점에 대해 설명합니다.
프록시
HttpBaseProtocolFilter 클래스는 요청별로 프록시를 구성하거나 재정의하는 것을 지원하지 않습니다. 즉, .NET 네이티브의 모든 요청은 HttpClientHandler.UseProxy 속성 값에 따라 시스템 구성 프록시 서버를 사용하거나 프록시 서버를 사용하지 않습니다. Windows 8.x 앱용 .NET에서 프록시 서버는 HttpClientHandler.Proxy 속성으로 정의됩니다. .NET 네이티브에서 HttpClientHandler.Proxy를 null
이외의 값으로 설정하면 PlatformNotSupportedException 예외가 발생합니다. HttpClientHandler.SupportsProxy 속성은 .NET 네이티브에서 false
를 반환하는 반면 Windows 8.x 앱용 표준 .NET Framework에서는 true
를 반환합니다.
자동 리디렉션
HttpBaseProtocolFilter 클래스는 최대 자동 리디렉션 수를 구성할 수 없습니다. HttpClientHandler.MaxAutomaticRedirections 속성 값은 표준 Windows 8.x 앱용 .NET 앱에서 기본적으로 50이며 수정할 수 있습니다. .NET 네이티브에서 이 속성의 값은 10이며 수정하려고 하면 PlatformNotSupportedException 예외가 발생합니다. HttpClientHandler.SupportsRedirectConfiguration 속성은 .NET 네이티브에서 false
를 반환하는 반면 Windows 8.x 앱용 .NET에서는 true
를 반환합니다.
자동 압축 풀기
Windows 8.x 앱용 .NET을 사용하면 HttpClientHandler.AutomaticDecompression 속성을 Deflate, GZip, Deflate 및 GZip 또는 None로 설정할 수 있습니다. .NET 네이티브는 GZip 또는 None와 함께 Deflate만 지원합니다. AutomaticDecompression 속성을 Deflate 또는 GZip 중 하나만으로 설정하면 Deflate 및 GZip둘 다로 자동 설정됩니다.
쿠키
쿠키 처리는 HttpClient 및 WinINet에서 동시에 수행됩니다. CookieContainer 의 쿠키는 WinINet 쿠키 캐시의 쿠키와 결합됩니다. CookieContainer 에서 쿠키를 제거하면 HttpClient 가 쿠키를 보낼 수 없습니다. 그러나 WinINet에서 쿠키를 이미 확인했으며 사용자가 쿠키를 삭제하지 않은 경우에는 WinINet이 쿠키를 보냅니다. HttpClient, HttpClientHandler또는 CookieContainer API를 사용하여 WinINet에서 프로그래밍 방식으로 쿠키를 제거할 수는 없습니다. HttpClientHandler.UseCookies 속성을 false
로 설정하면 HttpClient 만 쿠키 보내기를 중지하며 WinINet은 요청에 쿠키를 계속 포함할 수 있습니다.
자격 증명
Windows 8.x 앱용 .NET에서 HttpClientHandler.UseDefaultCredentials 및 HttpClientHandler.Credentials 속성은 독립적으로 작동합니다. 또한 Credentials 속성은 ICredentials 인터페이스를 구현하는 모든 개체를 수락합니다. .NET 네이티브에서 UseDefaultCredentials 속성을 true
로 설정하면 Credentials 속성이 null
이 됩니다. 또한 Credentials 속성은 null
, DefaultCredentials또는 NetworkCredential형식 개체로만 설정할 수 있습니다. 다른 ICredentials 개체(가장 널리 사용되는 항목은 CredentialCache)를 Credentials 속성에 할당하면 PlatformNotSupportedException이 throw됩니다.
기타 지원되지 않거나 구성할 수 없는 기능
.NET 네이티브에서:
HttpClientHandler.ClientCertificateOptions 속성의 값은 항상 Automatic입니다. Windows 8.x 앱용 .NET에서 기본값은 Manual입니다.
HttpClientHandler.MaxRequestContentBufferSize 속성은 구성할 수 없습니다.
HttpClientHandler.PreAuthenticate 속성은 항상
true
입니다. Windows 8.x 앱용 .NET에서 기본값은false
입니다.응답의
SetCookie2
헤더는 사용되지 않는 항목으로 간주되어 무시됩니다.
interop 차이점
사용되지 않는 API
관리되는 코드와의 상호 운용성을 위해 제공되었던 사용 빈도가 낮은 여러 API가 더 이상 사용되지 않습니다. .NET 네이티브와 함께 사용하는 경우 이러한 API는 NotImplementedException 또는 PlatformNotSupportedException 예외를 발생시키거나 컴파일러 오류를 일으킬 수 있습니다. Windows 8.x 앱용 .NET에서 이러한 API는 사용되지 않는 것으로 표시되지만 호출하면 컴파일러 오류가 아닌 컴파일러 경고가 생성됩니다.
VARIANT
마샬링에 사용되지 않는 API는 다음과 같습니다.
- System.Runtime.InteropServices.BStrWrapper
- System.Runtime.InteropServices.CurrencyWrapper
- System.Runtime.InteropServices.DispatchWrapper
- System.Runtime.InteropServices.ErrorWrapper
- System.Runtime.InteropServices.UnknownWrapper
- System.Runtime.InteropServices.VariantWrapper
- UnmanagedType.IDispatch
- UnmanagedType.SafeArray
- System.Runtime.InteropServices.VarEnum
UnmanagedType.Struct가 지원되지만 IDispatch 또는 byref
변형과 함께 사용되는 경우와 같은 일부 시나리오에서는 예외가 발생합니다.
IDispatch 지원을 위해 사용되지 않는 API는 다음과 같습니다.
- System.Runtime.InteropServices.ClassInterfaceType.AutoDispatch
- System.Runtime.InteropServices.ClassInterfaceType.AutoDual
- System.Runtime.InteropServices.ComDefaultInterfaceAttribute
클래식 COM 이벤트에 사용되지 않는 API는 다음과 같습니다.
.NET 네이티브에서 지원되지 않는 System.Runtime.InteropServices.ICustomQueryInterface 인터페이스에서 사용되지 않는 API는 다음과 같습니다.
- System.Runtime.InteropServices.ICustomQueryInterface(모든 멤버)
- System.Runtime.InteropServices.CustomQueryInterfaceMode(모든 멤버)
- System.Runtime.InteropServices.CustomQueryInterfaceResult(모든 멤버)
- System.Runtime.InteropServices.Marshal.GetComInterfaceForObject(Object, Type, CustomQueryInterfaceMode)
지원되지 않는 기타 interop 기능은 다음과 같습니다.
- System.Runtime.InteropServices.ICustomAdapter(모든 멤버)
- System.Runtime.InteropServices.SafeBuffer(모든 멤버)
- System.Runtime.InteropServices.UnmanagedType.Currency
- System.Runtime.InteropServices.UnmanagedType.VBByRefStr
- System.Runtime.InteropServices.UnmanagedType.AnsiBStr
- System.Runtime.InteropServices.UnmanagedType.AsAny
- System.Runtime.InteropServices.UnmanagedType.CustomMarshaler
드물게 사용되는 마샬링 API:
- System.Runtime.InteropServices.Marshal.ReadByte(Object, Int32)
- System.Runtime.InteropServices.Marshal.ReadInt16(Object, Int32)
- System.Runtime.InteropServices.Marshal.ReadInt32(Object, Int32)
- System.Runtime.InteropServices.Marshal.ReadInt64(Object, Int32)
- System.Runtime.InteropServices.Marshal.ReadIntPtr(Object, Int32)
- System.Runtime.InteropServices.Marshal.WriteByte(Object, Int32, Byte)
- System.Runtime.InteropServices.Marshal.WriteInt16(Object, Int32, Int16)
- System.Runtime.InteropServices.Marshal.WriteInt32(Object, Int32, Int32)
- System.Runtime.InteropServices.Marshal.WriteInt64(Object, Int32, Int64)
- System.Runtime.InteropServices.Marshal.WriteIntPtr(Object, Int32, IntPtr)
플랫폼 호출 및 COM interop 호환성
대부분의 플랫폼 호출 및 COM interop 시나리오는 .NET 네이티브에서 계속 지원됩니다. 특히 WinRT(Windows 런타임) API와의 모든 상호 운용성 및 Windows 런타임에 필요한 모든 마샬링은 지원됩니다. 여기에는 다음에 대한 마샬링 지원이 포함됩니다.
배열( UnmanagedType.ByValArray포함)
BStr
대리자
문자열(유니코드, ANSI 및 HSTRING)
구조체(
byref
및byval
)공용 구조체
Win32 핸들
모든 WinRT 구문
Variant 형식 마샬링에 대한 부분 지원. 지원되는 형식은 다음과 같습니다.
그러나 .NET 네이티브는 다음을 지원하지 않습니다.
기본 COM 이벤트 사용
관리되는 형식에서 System.Runtime.InteropServices.ICustomQueryInterface 인터페이스 구현
특성을 통해 관리되는 형식에서 IDispatch System.Runtime.InteropServices.ComDefaultInterfaceAttribute 인터페이스 구현. 그러나
IDispatch
를 통해 COM 개체를 호출할 수 없으며 관리 개체는IDispatch
를 구현할 수 없습니다.
리플렉션을 사용하여 플랫폼 호출 메서드를 호출할 수는 없습니다. 대신 다른 메서드에서 메서드 호출을 래핑하고 리플렉션을 사용해 래퍼를 호출하여 이 제한을 해결할 수 있습니다.
Windows 8.x 앱용 .NET API의 기타 차이점
이 섹션에서는 .NET 네이티브에서 지원되지 않는 나머지 API를 나열합니다. 지원되지 않는 API 중 가장 큰 집합은 WCF(Windows Communication Foundation) API입니다.
DataAnnotations(System.ComponentModel.DataAnnotations)
System.ComponentModel.DataAnnotations 및 System.ComponentModel.DataAnnotations.Schema 네임스페이스의 유형은 .NET 네이티브에서 지원되지 않습니다. 여기에는 Windows 8.x 앱용 .NET에 있는 다음 유형이 포함됩니다.
- System.ComponentModel.DataAnnotations.AssociationAttribute
- System.ComponentModel.DataAnnotations.ConcurrencyCheckAttribute
- System.ComponentModel.DataAnnotations.CustomValidationAttribute
- System.ComponentModel.DataAnnotations.DataType
- System.ComponentModel.DataAnnotations.DataTypeAttribute
- System.ComponentModel.DataAnnotations.DisplayAttribute
- System.ComponentModel.DataAnnotations.DisplayColumnAttribute
- DisplayFormatAttribute
- EditableAttribute
- EnumDataTypeAttribute
- System.ComponentModel.DataAnnotations.FilterUIHintAttribute
- System.ComponentModel.DataAnnotations.KeyAttribute
- System.ComponentModel.DataAnnotations.RangeAttribute
- System.ComponentModel.DataAnnotations.RegularExpressionAttribute
- System.ComponentModel.DataAnnotations.RequiredAttribute
- System.ComponentModel.DataAnnotations.StringLengthAttribute
- System.ComponentModel.DataAnnotations.TimestampAttribute
- System.ComponentModel.DataAnnotations.UIHintAttribute
- System.ComponentModel.DataAnnotations.ValidationAttribute
- System.ComponentModel.DataAnnotations.ValidationContext
- System.ComponentModel.DataAnnotations.ValidationException
- System.ComponentModel.DataAnnotations.ValidationResult
- System.ComponentModel.DataAnnotations.Validator
- System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedAttribute
- System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption
Visual Basic
Visual Basic은 현재 .NET 네이티브에서 지원되지 않습니다. Microsoft.VisualBasic 및 Microsoft.VisualBasic.CompilerServices 네임스페이스의 다음 유형은 .NET 네이티브에서 사용할 수 없습니다.
- Microsoft.VisualBasic.CallType
- Microsoft.VisualBasic.Constants
- Microsoft.VisualBasic.HideModuleNameAttribute
- Microsoft.VisualBasic.Strings
- Microsoft.VisualBasic.CompilerServices.Conversions
- Microsoft.VisualBasic.CompilerServices.DesignerGeneratedAttribute
- Microsoft.VisualBasic.CompilerServices.IncompleteInitialization
- Microsoft.VisualBasic.CompilerServices.NewLateBinding
- Microsoft.VisualBasic.CompilerServices.ObjectFlowControl
- Microsoft.VisualBasic.CompilerServices.ObjectFlowControl.ForLoopControl
- Microsoft.VisualBasic.CompilerServices.Operators
- Microsoft.VisualBasic.CompilerServices.OptionCompareAttribute
- Microsoft.VisualBasic.CompilerServices.OptionTextAttribute
- Microsoft.VisualBasic.CompilerServices.ProjectData
- Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute
- Microsoft.VisualBasic.CompilerServices.StaticLocalInitFlag
- Microsoft.VisualBasic.CompilerServices.Utils
리플렉션 컨텍스트(System.Reflection.Context 네임스페이스)
System.Reflection.Context.CustomReflectionContext 클래스는 .NET 네이티브에서 지원되지 않습니다.
RTC(System.Net.Http.Rtc)
System.Net.Http.RtcRequestFactory
클래스는 .NET 네이티브에서 지원되지 않습니다.
WCF(Windows Communication Foundation)(System.ServiceModel.*)
System.ServiceModel.* 네임스페이스의 유형은 .NET 네이티브에서 지원되지 않습니다. 여기에는 다음 유형이 포함됩니다.
- System.ServiceModel.ActionNotSupportedException
- System.ServiceModel.BasicHttpBinding
- System.ServiceModel.BasicHttpMessageCredentialType
- System.ServiceModel.BasicHttpSecurity
- System.ServiceModel.BasicHttpSecurityMode
- System.ServiceModel.CallbackBehaviorAttribute
- System.ServiceModel.ChannelFactory
- System.ServiceModel.ChannelFactory<TChannel>
- System.ServiceModel.ClientBase<TChannel>
- System.ServiceModel.ClientBase<TChannel>.BeginOperationDelegate
- System.ServiceModel.ClientBase<TChannel>.ChannelBase<T>
- System.ServiceModel.ClientBase<TChannel>.EndOperationDelegate
- System.ServiceModel.ClientBase<TChannel>.InvokeAsyncCompletedEventArgs
- System.ServiceModel.CommunicationException
- System.ServiceModel.CommunicationObjectAbortedException
- System.ServiceModel.CommunicationObjectFaultedException
- System.ServiceModel.CommunicationState
- System.ServiceModel.DataContractFormatAttribute
- System.ServiceModel.DnsEndpointIdentity
- System.ServiceModel.DuplexChannelFactory<TChannel>
- System.ServiceModel.DuplexClientBase<TChannel>
- System.ServiceModel.EndpointAddress
- System.ServiceModel.EndpointAddressBuilder
- System.ServiceModel.EndpointIdentity
- System.ServiceModel.EndpointNotFoundException
- System.ServiceModel.EnvelopeVersion
- System.ServiceModel.ExceptionDetail
- System.ServiceModel.FaultCode
- System.ServiceModel.FaultContractAttribute
- System.ServiceModel.FaultException
- System.ServiceModel.FaultException<TDetail>
- System.ServiceModel.FaultReason
- System.ServiceModel.FaultReasonText
- System.ServiceModel.HttpBindingBase
- System.ServiceModel.HttpClientCredentialType
- System.ServiceModel.HttpTransportSecurity
- System.ServiceModel.IClientChannel
- System.ServiceModel.ICommunicationObject
- System.ServiceModel.IContextChannel
- System.ServiceModel.IDefaultCommunicationTimeouts
- System.ServiceModel.IExtensibleObject<T>
- System.ServiceModel.IExtension<T>
- System.ServiceModel.IExtensionCollection<T>
- System.ServiceModel.InstanceContext
- System.ServiceModel.InvalidMessageContractException
- System.ServiceModel.MessageBodyMemberAttribute
- System.ServiceModel.MessageContractAttribute
- System.ServiceModel.MessageContractMemberAttribute
- System.ServiceModel.MessageCredentialType
- System.ServiceModel.MessageHeader<T>
- System.ServiceModel.MessageHeaderException
- System.ServiceModel.MessageParameterAttribute
- System.ServiceModel.MessageSecurityOverTcp
- System.ServiceModel.MessageSecurityVersion
- System.ServiceModel.NetHttpBinding
- System.ServiceModel.NetHttpMessageEncoding
- System.ServiceModel.NetTcpBinding
- System.ServiceModel.NetTcpSecurity
- System.ServiceModel.OperationContext
- System.ServiceModel.OperationContextScope
- System.ServiceModel.OperationContractAttribute
- System.ServiceModel.OperationFormatStyle
- System.ServiceModel.ProtocolException
- System.ServiceModel.QuotaExceededException
- System.ServiceModel.SecurityMode
- System.ServiceModel.ServerTooBusyException
- System.ServiceModel.ServiceActivationException
- System.ServiceModel.ServiceContractAttribute
- System.ServiceModel.ServiceKnownTypeAttribute
- System.ServiceModel.SpnEndpointIdentity
- System.ServiceModel.TcpClientCredentialType
- System.ServiceModel.TcpTransportSecurity
- System.ServiceModel.TransferMode
- System.ServiceModel.UnknownMessageReceivedEventArgs
- System.ServiceModel.UpnEndpointIdentity
- System.ServiceModel.XmlSerializerFormatAttribute
- System.ServiceModel.Channels.AddressHeader
- System.ServiceModel.Channels.AddressHeaderCollection
- System.ServiceModel.Channels.AddressingVersion
- System.ServiceModel.Channels.BinaryMessageEncodingBindingElement
- System.ServiceModel.Channels.ChannelManagerBase
- System.ServiceModel.Channels.ChannelParameterCollection
- System.ServiceModel.Channels.CommunicationObject
- System.ServiceModel.Channels.CompressionFormat
- System.ServiceModel.Channels.ConnectionOrientedTransportBindingElement
- System.ServiceModel.Channels.CustomBinding
- System.ServiceModel.Channels.FaultConverter
- System.ServiceModel.Channels.HttpRequestMessageProperty
- System.ServiceModel.Channels.HttpResponseMessageProperty
- System.ServiceModel.Channels.HttpsTransportBindingElement
- System.ServiceModel.Channels.HttpTransportBindingElement
- System.ServiceModel.Channels.IChannel
- System.ServiceModel.Channels.IChannelFactory
- System.ServiceModel.Channels.IChannelFactory<TChannel>
- System.ServiceModel.Channels.IDuplexChannel
- System.ServiceModel.Channels.IDuplexSession
- System.ServiceModel.Channels.IDuplexSessionChannel
- System.ServiceModel.Channels.IHttpCookieContainerManager
- System.ServiceModel.Channels.IInputChannel
- System.ServiceModel.Channels.IInputSession
- System.ServiceModel.Channels.IInputSessionChannel
- System.ServiceModel.Channels.IMessageProperty
- System.ServiceModel.Channels.IOutputChannel
- System.ServiceModel.Channels.IOutputSession
- System.ServiceModel.Channels.IOutputSessionChannel
- System.ServiceModel.Channels.IRequestChannel
- System.ServiceModel.Channels.IRequestSessionChannel
- System.ServiceModel.Channels.ISession
- System.ServiceModel.Channels.ISessionChannel<TSession>
- System.ServiceModel.Channels.LocalClientSecuritySettings
- System.ServiceModel.Channels.Message
- System.ServiceModel.Channels.MessageBuffer
- System.ServiceModel.Channels.MessageEncoder
- System.ServiceModel.Channels.MessageEncoderFactory
- System.ServiceModel.Channels.MessageEncodingBindingElement
- System.ServiceModel.Channels.MessageFault
- System.ServiceModel.Channels.MessageHeader
- System.ServiceModel.Channels.MessageHeaderInfo
- System.ServiceModel.Channels.MessageHeaders
- System.ServiceModel.Channels.MessageProperties
- System.ServiceModel.Channels.MessageState
- System.ServiceModel.Channels.MessageVersion
- System.ServiceModel.Channels.RequestContext
- System.ServiceModel.Channels.SecurityBindingElement
- System.ServiceModel.Channels.SecurityHeaderLayout
- System.ServiceModel.Channels.SslStreamSecurityBindingElement
- System.ServiceModel.Channels.TcpConnectionPoolSettings
- System.ServiceModel.Channels.TcpTransportBindingElement
- System.ServiceModel.Channels.TextMessageEncodingBindingElement
- System.ServiceModel.Channels.TransportBindingElement
- System.ServiceModel.Channels.TransportSecurityBindingElement
- System.ServiceModel.Channels.WebSocketTransportSettings
- System.ServiceModel.Channels.WebSocketTransportUsage
- System.ServiceModel.Channels.WindowsStreamSecurityBindingElement
- System.ServiceModel.Description.ClientCredentials
- System.ServiceModel.Description.ContractDescription
- System.ServiceModel.Description.DataContractSerializerOperationBehavior
- System.ServiceModel.Description.FaultDescription
- System.ServiceModel.Description.FaultDescriptionCollection
- System.ServiceModel.Description.IContractBehavior
- System.ServiceModel.Description.IEndpointBehavior
- System.ServiceModel.Description.IOperationBehavior
- System.ServiceModel.Description.MessageBodyDescription
- System.ServiceModel.Description.MessageDescription
- System.ServiceModel.Description.MessageDescriptionCollection
- System.ServiceModel.Description.MessageDirection
- System.ServiceModel.Description.MessageHeaderDescription
- System.ServiceModel.Description.MessageHeaderDescriptionCollection
- System.ServiceModel.Description.MessagePartDescription
- System.ServiceModel.Description.MessagePartDescriptionCollection
- System.ServiceModel.Description.MessagePropertyDescription
- System.ServiceModel.Description.MessagePropertyDescriptionCollection
- System.ServiceModel.Description.OperationDescription
- System.ServiceModel.Description.OperationDescriptionCollection
- System.ServiceModel.Description.ServiceEndpoint
- System.ServiceModel.Dispatcher.ClientOperation
- System.ServiceModel.Dispatcher.ClientRuntime
- System.ServiceModel.Dispatcher.DispatchOperation
- System.ServiceModel.Dispatcher.DispatchRuntime
- System.ServiceModel.Dispatcher.EndpointDispatcher
- System.ServiceModel.Dispatcher.IClientMessageFormatter
- System.ServiceModel.Dispatcher.IClientMessageInspector
- System.ServiceModel.Dispatcher.IClientOperationSelector
- System.ServiceModel.Dispatcher.IParameterInspector
- System.ServiceModel.Security.BasicSecurityProfileVersion
- System.ServiceModel.Security.HttpDigestClientCredential
- System.ServiceModel.Security.MessageSecurityException
- System.ServiceModel.Security.SecureConversationVersion
- System.ServiceModel.Security.SecurityAccessDeniedException
- System.ServiceModel.Security.SecurityPolicyVersion
- System.ServiceModel.Security.SecurityVersion
- System.ServiceModel.Security.TrustVersion
- System.ServiceModel.Security.UserNamePasswordClientCredential
- System.ServiceModel.Security.WindowsClientCredential
- System.ServiceModel.Security.Tokens.SecureConversationSecurityTokenParameters
- System.ServiceModel.Security.Tokens.SecurityTokenParameters
- System.ServiceModel.Security.Tokens.SupportingTokenParameters
- System.ServiceModel.Security.Tokens.UserNameSecurityTokenParameters
serializer의 차이점
DataContractSerializer, DataContractJsonSerializer및 XmlSerializer 클래스의 serialization 및 deserialization에는 다음과 같은 차이점이 있습니다.
.NET 네이티브에서 DataContractSerializer 및 DataContractJsonSerializer는 유형이 루트 직렬화 유형이 아닌 기본 클래스 멤버가 있는 파생 클래스를 직렬화하거나 역직렬화하지 못합니다. 예를 들어 다음 코드에서
Y
를 직렬화 또는 역직렬화하려고 하면 오류가 발생합니다.using System; public class InnerType{} public class X { public InnerType instance { get; set; } } public class Y : X {}
기본 클래스의 멤버가 serialization 중에 트래버스되지 않으므로 serializer가
InnerType
형식을 인식하지 못합니다.DataContractSerializer 및 DataContractJsonSerializer 가 IEnumerable<T> 인터페이스를 구현하는 클래스나 구조체를 serialize하지 못합니다. 예를 들어 다음과 같은 형식은 직렬화 또는 역직렬화할 수 없습니다.
XmlSerializer 가 다음 개체 값을 serialize하지 못합니다. serialize할 정확한 개체 형식을 알 수 없기 때문입니다.
XmlSerializer 는 직렬화된 개체의 형식이 XmlQualifiedName이면 해당 개체를 직렬화 또는 역직렬화할 수 없습니다.
모든 serializer(DataContractSerializer, DataContractJsonSerializer및 XmlSerializer)는 System.Xml.Linq.XElement 를 포함하는 형식 또는 XElement형식에 대해 serialization 코드를 생성하지 못하며, 대신 빌드 시간 오류가 표시됩니다.
serialization 형식의 다음 생성자에 대해서는 정상적인 작동이 보장되지 않습니다.
DataContractSerializer(Type, DataContractSerializerSettings)
DataContractSerializer(Type, String, String, IEnumerable<Type>)
DataContractSerializer(Type, XmlDictionaryString, XmlDictionaryString, IEnumerable<Type>)
DataContractJsonSerializer(Type, DataContractJsonSerializerSettings)
XmlSerializer(Type, XmlAttributeOverrides, Type[], XmlRootAttribute, String)
XmlSerializer 는 메서드에 다음 특성이 포함된 형식에 대해 코드를 생성하지 못합니다.
XmlSerializer 는 IXmlSerializable 사용자 지정 serialization 인터페이스를 따르지 않습니다. 이 인터페이스를 구현하는 클래스가 있는 경우 XmlSerializer 는 해당 형식을 POCO(Plain Old CLR 개체) 형식으로 간주하여 public 속성만 serialize합니다.
일반 Exception 개체를 직렬화하는 것은 DataContractSerializer 및 DataContractJsonSerializer에서 제대로 작동하지 않습니다.
Visual Studio의 차이점
예외 및 디버깅
디버거에서 .NET 네이티브를 사용하여 컴파일된 앱을 실행하는 경우 다음 예외 유형에 대해 첫 번째 예외가 설정됩니다.
앱 빌드
Visual Studio에서 기본적으로 사용되는 x86 빌드 도구를 사용합니다. C:\Program Files (x86)\MSBuild\12.0\bin\amd64에 있는 AMD64 MSBuild 도구를 사용하는 경우 빌드 문제가 발생할 수 있으므로 사용하지 않는 것이 좋습니다.
프로파일러
Visual Studio CPU 프로파일러 및 XAML 메모리 프로파일러에 내 코드만 옵션이 올바르게 표시되지 않습니다.
XAML 메모리 프로파일러에 관리되는 힙 데이터가 정확하게 표시되지 않습니다.
CPU 프로파일러가 모듈을 올바르게 식별하지 않으며 접두사가 붙은 함수 이름을 표시합니다.
단위 테스트 라이브러리 프로젝트
Windows 8.x 앱 프로젝트의 단위 테스트 라이브러리에서 .NET 네이티브를 사용하도록 설정하는 것은 지원되지 않으며 프로젝트를 빌드하지 못하게 합니다.