다음을 통해 공유


OutAttribute 클래스

데이터가 피호출자로부터 호출자로 마샬링 됨을 나타냅니다.

네임스페이스: System.Runtime.InteropServices
어셈블리: mscorlib(mscorlib.dll)

구문

‘선언
<ComVisibleAttribute(True)> _
<AttributeUsageAttribute(AttributeTargets.Parameter, Inherited:=False)> _
Public NotInheritable Class OutAttribute
    Inherits Attribute
‘사용 방법
Dim instance As OutAttribute
[ComVisibleAttribute(true)] 
[AttributeUsageAttribute(AttributeTargets.Parameter, Inherited=false)] 
public sealed class OutAttribute : Attribute
[ComVisibleAttribute(true)] 
[AttributeUsageAttribute(AttributeTargets::Parameter, Inherited=false)] 
public ref class OutAttribute sealed : public Attribute
/** @attribute ComVisibleAttribute(true) */ 
/** @attribute AttributeUsageAttribute(AttributeTargets.Parameter, Inherited=false) */ 
public final class OutAttribute extends Attribute
ComVisibleAttribute(true) 
AttributeUsageAttribute(AttributeTargets.Parameter, Inherited=false) 
public final class OutAttribute extends Attribute

설명

이 특성을 매개 변수에 적용할 수 있습니다.

OutAttribute는 선택 사항입니다. 이 특성은 COM interop과 플랫폼 호출에만 지원됩니다. 명시적 설정이 없으면 interop 마샬러는 매개 변수의 형식, 매개 변수가 참조로 전달되는지 또는 값으로 전달되는지 여부 및 형식이 blittable인지 blittable이 아닌지 여부를 기준으로 규칙을 사용합니다. 예를 들어, StringBuilder 클래스는 항상 In/Out으로 취급되고, 값으로 전달되는 문자열 배열은 In으로 취급됩니다.

Out 전용 동작은 매개 변수에 대한 기본 마샬링 동작이 아닙니다. OutAttribute를 값과 참조로 전달된 참조 형식에 적용하여 In/Out 동작을 Out 전용 동작으로 변경할 수 있으며, 이는 C#의 out 키워드를 사용하는 것과 같습니다. 예를 들어, 값으로 전달된 배열은 기본적으로 In 전용 매개 변수로 마샬링되므로 Out 전용으로 변경할 수 있습니다. 그러나 형식에 모든 blittable 요소나 필드가 포함되어 있을 때는 interop 마샬러가 고정 기능을 사용하므로 이 동작이 예상했던 의미를 제공하지 않는 경우도 있습니다. 데이터를 피호출자에게 전달하는 것에 대해 고려하지 않아도 될 경우에는 blittable 이외의 형식에 대해 Out 전용 마샬링을 사용하여 성능을 향상시킬 수 있습니다.

InAttributeOutAttribute를 조합하면 배열과 서식이 지정된 blittable 이외의 형식에 적용되는 경우 특히 유용합니다. 이 두 속성을 모두 적용한 경우에만 피호출자가 이러한 형식에 변경한 내용을 호출자가 볼 수 있습니다. 이러한 형식은 마샬링 하는 동안 복사를 요구하기 때문에, InAttributeOutAttribute를 사용하여 불필요한 복사본을 줄일 수 있습니다.

마샬링 동작에서 OutAttribute의 효과에 대한 자세한 내용은 방향 특성을 참조하십시오.

예제

다음 예제에서는 매개 변수로 배열을 전달하는 플랫폼 호출 프로토타입에 InAttributeOutAttribute를 적용하는 방법을 보여 줍니다. 이러한 방향 특성의 조합을 통해 호출자는 호출 수신자가 변경한 내용을 볼 수 있습니다.

' Declare a class member for each structure element.
< StructLayout( LayoutKind.Sequential, CharSet:=CharSet.Auto )> _
Public Class OpenFileName

   Public structSize As Integer = 0
   Public filter As String = Nothing
   Public file As String = Nothing
   ' ...
   
End Class 'OpenFileName

Public Class LibWrap
   ' Declare managed prototype for the unmanaged function.
   Declare Auto Function GetOpenFileName Lib "Comdlg32.dll" ( _
      <[In], Out> ByVal ofn As OpenFileName ) As Boolean
End Class 'LibWrap
// Declare a class member for each structure element.
[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Auto )]  
public class OpenFileName 
{
    public int       structSize = 0;
    public string    filter = null;
    public string    file = null;
    // ...
}

public class LibWrap
{
   // Declare a managed prototype for the unmanaged function.
   [ DllImport( "Comdlg32.dll", CharSet=CharSet.Auto )]
   public static extern bool GetOpenFileName([ In, Out ] OpenFileName ofn );  
}
// Declare a class member for each structure element.

[StructLayout(LayoutKind::Sequential,CharSet=CharSet::Auto)]
public ref class OpenFileName
{
public:
   int structSize;
   String^ filter;
   String^ file;
   // ...
};

public ref class LibWrap
{
public:

   // Declare a managed prototype for the unmanaged function.

   [DllImport("Comdlg32.dll",CharSet=CharSet::Auto)]
   static bool GetOpenFileName( [In,Out]OpenFileName^ ofn );
};
// Declare a class member for each structure element.
/** @attribute StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)
 */
public class OpenFileName
{
    public int structSize = 0;
    public String filter = null;
    public String file = null;
    // ...
} //OpenFileName

public class LibWrap
{
    // Declare a managed prototype for the unmanaged function.
    /** @attribute DllImport("Comdlg32.dll", CharSet = CharSet.Auto)
     */
    public static native boolean GetOpenFileName(
        /** @attribute In()
            @attribute Out()
         */
        OpenFileName ofn);
} //LibWrap

상속 계층 구조

System.Object
   System.Attribute
    System.Runtime.InteropServices.OutAttribute

스레드로부터의 안전성

이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.

플랫폼

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0, 1.1, 1.0에서 지원

.NET Compact Framework

2.0, 1.0에서 지원

참고 항목

참조

OutAttribute 멤버
System.Runtime.InteropServices 네임스페이스
InAttribute 클래스
StringBuilder

기타 리소스

Blittable 형식 및 비 Blittable 형식