Share via


방향 특성

모든 메서드 매개 변수는 InAttribute 특성이나 OutAttribute 특성 또는 이 둘 모두와 연관될 수 있습니다. 디자인 타임에 방향 특성을 적용하여 관리되는 메모리와 관리되지 않는 메모리 사이의 런타임 마샬링을 수정할 수 있습니다.

InAttributeOutAttributeSystem.Runtime.InteropServices 네임스페이스에 있으며, IDL(인터페이스 정의 언어) 인터페이스 특성인 [in], [out], [in/out] 및 **[out, retval]**과 같습니다.

참고참고

관리되는 메서드 시그니처의 반환 값은 항상 형식 라이브러리의 [out, retval]에 매핑됩니다.이에 해당하며 사용자가 적용할 수 있는 방향 특성은 없습니다.

방향 특성은 선택적입니다. 마샬러의 기본 동작을 변경하려는 경우에 메서드 매개 변수에 이 특성을 적용합니다. 메서드 매개 변수에서 방향 특성을 생략하면 마샬러에서는 매개 변수의 형식(값 또는 참조)과 형식 한정자에 따라 방향 흐름을 결정합니다.

일부 언어에서는 메서드 매개 변수의 방향 흐름을 수정할 수 있는 키워드를 제공합니다. 다음 표에서는 Visual Basic 2005 및 C#에서 제공하는 방향 관련 키워드와 이에 해당하는 IDL 인터페이스 특성을 보여 줍니다.

Visual Basic 2005

C#

IDL 특성

ByVal

해당 사항이 없습니다.

In

ByRef

ref

[in/out]

해당 사항이 없습니다.

out

[out]

ByRef, refout 매개 변수 한정자는 메서드 인수가 값이 아니라 참조로 마샬링되도록 합니다. 값으로 전달되는 메서드 인수는 스택에 있는 값으로서 비관리 코드로 마샬링되고, 참조로 전달되는 인수는 스택에 있는 포인터로서 마샬링됩니다. 다음 그림에서는 매개 변수 한정자가 포함된 값 형식참조 형식의 기본 마샬링 동작을 보여 줍니다.

비관리 코드에 대한 메서드 인수의 기본 마샬링

기본 마샬링 동작

기본적으로, 값으로 전달되는 클래스, 배열, 문자열, 인터페이스 등의 참조 형식은 성능상의 이유로 In 매개 변수로 마샬링됩니다. 메서드 매개 변수에 InAttributeOutAttribute(또는 OutAttribute만)를 적용하지 않으면 이러한 형식의 변경 내용을 볼 수 없습니다. 이 규칙의 예외인 StringBuilder 클래스는 In/Out 매개 변수로 마샬링됩니다.

interop 마샬러에서는 방향 특성과 관련하여 다음의 동작을 보장합니다.

  • interop 마샬러에서는 비관리 코드에서 전달된 In 매개 변수에 대해 쓰기 작업을 생성하지 않습니다. 따라서 비관리 코드에서는 읽기 전용 페이지에 대한 포인터나 동시에 액세스되는 데이터에 대한 포인터를 안전하게 전달할 수 있습니다.

  • 복사된 개체에 BSTR 등의 할당된 개체가 포함되어 있으면 마샬러에서는 항상 In/Out 설정에서 요구하는 올바른 할당 및 소멸 시퀀스를 실행합니다.

코드에 방향 특성을 적용할 때는 정확하게 해야 합니다. 관리 코드에서 매개 변수에 InAttributeOutAttribute를 올바르게 적용하면 형식 라이브러리 내보내기(Tlbexp.exe)에서는 해당 비트를 사용하여 해당 형식 라이브러리의 In/Out 비트를 설정할 수 있습니다. 이는 일부 배열 및 클래스 같이 고정될 수 있는 참조 형식에 특히 중요합니다.

참고 항목

개념

Interop 마샬러를 사용한 메모리 관리

Blittable 형식 및 비 Blittable 형식

복사 및 고정

기타 리소스

기본 마샬링 동작