ParameterBuilder 클래스
매개 변수 정보를 만들거나 연결합니다.
네임스페이스: System.Reflection.Emit
어셈블리: mscorlib(mscorlib.dll)
구문
‘선언
<ClassInterfaceAttribute(ClassInterfaceType.None)> _
<ComVisibleAttribute(True)> _
Public Class ParameterBuilder
Implements _ParameterBuilder
‘사용 방법
Dim instance As ParameterBuilder
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public class ParameterBuilder : _ParameterBuilder
[ClassInterfaceAttribute(ClassInterfaceType::None)]
[ComVisibleAttribute(true)]
public ref class ParameterBuilder : _ParameterBuilder
/** @attribute ClassInterfaceAttribute(ClassInterfaceType.None) */
/** @attribute ComVisibleAttribute(true) */
public class ParameterBuilder implements _ParameterBuilder
ClassInterfaceAttribute(ClassInterfaceType.None)
ComVisibleAttribute(true)
public class ParameterBuilder implements _ParameterBuilder
설명
매개 변수 특성은 메서드 시그니처와 일치해야 합니다. 매개 변수에 Out 특성을 지정한 경우 해당 메서드의 매개 변수는 ByRef 형식이어야 합니다.
일부 ParameterBuilder 특성의 경우에는 MSIL(Microsoft intermediate language)이 런타임에 올바로 작동할 수 있도록 지속 가능한 매개 변수를 사용하여 DefineMethod를 호출해야 합니다. 예를 들어, ParameterAttributes.Out 특성이 설정된 ParameterBuilder를 MethodBuilder의 첫 번째 매개 변수로 지정하는 경우, MethodBuilder의 첫 번째 매개 변수는 Type.GetType("System.String") 형식이 아닌 Type.GetType("System.String&") 형식의 참조가 되어야 합니다.
예제
다음 예제에서는 ParameterBuilder를 사용하여 참조로 전달된 매개 변수가 있는 동적 메서드를 만드는 방법을 보여 줍니다.
Imports System
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
_
Class ParamBuilderDemo
Public Shared Function BuildCustomerDataType() As Type
Dim myDomain As AppDomain = Thread.GetDomain()
Dim myAsmName As New AssemblyName()
myAsmName.Name = "MyDynamicAssembly"
Dim myAsmBuilder As AssemblyBuilder = myDomain.DefineDynamicAssembly(myAsmName, _
AssemblyBuilderAccess.Run)
Dim myModBuilder As ModuleBuilder = myAsmBuilder.DefineDynamicModule("MyMod")
Dim myTypeBuilder As TypeBuilder = myModBuilder.DefineType("CustomerData", TypeAttributes.Public)
Dim customerNameBldr As FieldBuilder = myTypeBuilder.DefineField("customerName", _
GetType(String), _
FieldAttributes.Private)
Dim acctIDBldr As FieldBuilder = myTypeBuilder.DefineField("acctID", _
GetType(String), _
FieldAttributes.Private)
Dim balanceAmtBldr As FieldBuilder = myTypeBuilder.DefineField("balanceAmt", _
GetType(Double), _
FieldAttributes.Private)
Dim myCtorBuilder As ConstructorBuilder = myTypeBuilder.DefineConstructor(MethodAttributes.Public, _
CallingConventions.HasThis, _
New Type() {GetType(String), _
GetType(String), _
GetType(Double)})
Dim ctorIL As ILGenerator = myCtorBuilder.GetILGenerator()
Dim objType As Type = Type.GetType("System.Object")
Dim objCtor As ConstructorInfo = objType.GetConstructor(New Type(){})
ctorIL.Emit(OpCodes.Ldarg_0)
ctorIL.Emit(OpCodes.Call, objCtor)
ctorIL.Emit(OpCodes.Ldarg_0)
ctorIL.Emit(OpCodes.Ldarg_1)
ctorIL.Emit(OpCodes.Stfld, customerNameBldr)
ctorIL.Emit(OpCodes.Ldarg_0)
ctorIL.Emit(OpCodes.Ldarg_2)
ctorIL.Emit(OpCodes.Stfld, acctIDBldr)
ctorIL.Emit(OpCodes.Ldarg_0)
ctorIL.Emit(OpCodes.Ldarg_3)
ctorIL.Emit(OpCodes.Stfld, balanceAmtBldr)
ctorIL.Emit(OpCodes.Ret)
' This method will take an amount from a static pool and add it to the balance.
' Note that we are passing the first parameter, fundsPool, by reference. Therefore,
' we need to inform the MethodBuilder to expect a ref, by declaring the first
' parameter's type to be System.Double& (a reference to a double).
Dim myMthdBuilder As MethodBuilder = myTypeBuilder.DefineMethod("AddFundsFromPool", _
MethodAttributes.Public, _
GetType(Double), _
New Type() {Type.GetType("System.Double&"), _
GetType(Double)})
Dim poolRefBuilder As ParameterBuilder = myMthdBuilder.DefineParameter(1, _
ParameterAttributes.Out, "fundsPool")
Dim amountFromPoolBuilder As ParameterBuilder = myMthdBuilder.DefineParameter(2, _
ParameterAttributes.In, "amountFromPool")
Dim mthdIL As ILGenerator = myMthdBuilder.GetILGenerator()
mthdIL.Emit(OpCodes.Ldarg_1)
mthdIL.Emit(OpCodes.Ldarg_1)
mthdIL.Emit(OpCodes.Ldind_R8)
mthdIL.Emit(OpCodes.Ldarg_2)
mthdIL.Emit(OpCodes.Sub)
mthdIL.Emit(OpCodes.Stind_R8)
mthdIL.Emit(OpCodes.Ldarg_0)
mthdIL.Emit(OpCodes.Ldarg_0)
mthdIL.Emit(OpCodes.Ldfld, balanceAmtBldr)
mthdIL.Emit(OpCodes.Ldarg_2)
mthdIL.Emit(OpCodes.Add)
mthdIL.Emit(OpCodes.Stfld, balanceAmtBldr)
mthdIL.Emit(OpCodes.Ldarg_0)
mthdIL.Emit(OpCodes.Ldfld, balanceAmtBldr)
mthdIL.Emit(OpCodes.Ret)
Return myTypeBuilder.CreateType()
End Function 'BuildCustomerDataType
Public Shared Sub Main()
Dim custType As Type = Nothing
Dim custObj As Object = Nothing
Dim custArgTypes() As Type = {GetType(String), GetType(String), GetType(Double)}
' Call the method to build our dynamic class.
custType = BuildCustomerDataType()
Console.WriteLine("---")
Dim myCustCtor As ConstructorInfo = custType.GetConstructor(custArgTypes)
Dim initialBalance As Double = 100.0
custObj = myCustCtor.Invoke(New Object() {"Joe Consumer", "5678-XYZ", initialBalance})
Dim myMemberInfo As MemberInfo() = custType.GetMember("AddFundsFromPool")
Dim thePool As Double = 1000.0
Console.WriteLine("The pool is currently ${0}", thePool)
Console.WriteLine("The original balance of the account instance is ${0}", initialBalance)
Dim amountFromPool As Double = 50.0
Console.WriteLine("The amount to be subtracted from the pool and added " & _
"to the account is ${0}", amountFromPool)
Console.WriteLine("---")
Console.WriteLine("Calling {0} ...", myMemberInfo(0).ToString())
Console.WriteLine("---")
Dim passMe() As Object = {thePool, amountFromPool}
Console.WriteLine("The new balance in the account instance is ${0}", _
custType.InvokeMember("AddFundsFromPool", _
BindingFlags.InvokeMethod, Nothing, custObj, passMe))
thePool = CDbl(passMe(0))
Console.WriteLine("The new amount in the pool is ${0}", thePool)
End Sub 'Main
End Class 'ParamBuilderDemo
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
class ParamBuilderDemo
{
public static Type BuildCustomerDataType()
{
AppDomain myDomain = Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = "MyDynamicAssembly";
AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly(myAsmName,
AssemblyBuilderAccess.Run);
ModuleBuilder myModBuilder = myAsmBuilder.DefineDynamicModule("MyMod");
TypeBuilder myTypeBuilder = myModBuilder.DefineType("CustomerData",
TypeAttributes.Public);
FieldBuilder customerNameBldr = myTypeBuilder.DefineField("customerName",
typeof(string),
FieldAttributes.Private);
FieldBuilder acctIDBldr = myTypeBuilder.DefineField("acctID",
typeof(string),
FieldAttributes.Private);
FieldBuilder balanceAmtBldr = myTypeBuilder.DefineField("balanceAmt",
typeof(double),
FieldAttributes.Private);
ConstructorBuilder myCtorBuilder = myTypeBuilder.DefineConstructor(
MethodAttributes.Public,
CallingConventions.HasThis,
new Type[] { typeof(string),
typeof(string),
typeof(double) });
ILGenerator ctorIL = myCtorBuilder.GetILGenerator();
Type objType = Type.GetType("System.Object");
ConstructorInfo objCtor = objType.GetConstructor(new Type[] {});
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Call, objCtor);
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Ldarg_1);
ctorIL.Emit(OpCodes.Stfld, customerNameBldr);
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Ldarg_2);
ctorIL.Emit(OpCodes.Stfld, acctIDBldr);
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Ldarg_3);
ctorIL.Emit(OpCodes.Stfld, balanceAmtBldr);
ctorIL.Emit(OpCodes.Ret);
// This method will take an amount from a static pool and add it to the balance.
// Note that we are passing the first parameter, fundsPool, by reference. Therefore,
// we need to inform the MethodBuilder to expect a ref, by declaring the first
// parameter's type to be System.Double& (a reference to a double).
MethodBuilder myMthdBuilder = myTypeBuilder.DefineMethod("AddFundsFromPool",
MethodAttributes.Public,
typeof(double),
new Type[] { Type.GetType("System.Double&"),
typeof(double) });
ParameterBuilder poolRefBuilder = myMthdBuilder.DefineParameter(1,
ParameterAttributes.Out,
"fundsPool");
ParameterBuilder amountFromPoolBuilder = myMthdBuilder.DefineParameter(2,
ParameterAttributes.In,
"amountFromPool");
ILGenerator mthdIL = myMthdBuilder.GetILGenerator();
mthdIL.Emit(OpCodes.Ldarg_1);
mthdIL.Emit(OpCodes.Ldarg_1);
mthdIL.Emit(OpCodes.Ldind_R8);
mthdIL.Emit(OpCodes.Ldarg_2);
mthdIL.Emit(OpCodes.Sub);
mthdIL.Emit(OpCodes.Stind_R8);
mthdIL.Emit(OpCodes.Ldarg_0);
mthdIL.Emit(OpCodes.Ldarg_0);
mthdIL.Emit(OpCodes.Ldfld, balanceAmtBldr);
mthdIL.Emit(OpCodes.Ldarg_2);
mthdIL.Emit(OpCodes.Add);
mthdIL.Emit(OpCodes.Stfld, balanceAmtBldr);
mthdIL.Emit(OpCodes.Ldarg_0);
mthdIL.Emit(OpCodes.Ldfld, balanceAmtBldr);
mthdIL.Emit(OpCodes.Ret);
return myTypeBuilder.CreateType();
}
public static void Main()
{
Type custType = null;
object custObj = null;
Type[] custArgTypes = new Type[] {typeof(string), typeof(string), typeof(double)};
// Call the method to build our dynamic class.
custType = BuildCustomerDataType();
Console.WriteLine("---");
ConstructorInfo myCustCtor = custType.GetConstructor(custArgTypes);
double initialBalance = 100.00;
custObj = myCustCtor.Invoke(new object[] { "Joe Consumer",
"5678-XYZ",
initialBalance });
MemberInfo[] myMemberInfo = custType.GetMember("AddFundsFromPool");
double thePool = 1000.00;
Console.WriteLine("The pool is currently ${0}", thePool);
Console.WriteLine("The original balance of the account instance is ${0}",
initialBalance);
double amountFromPool = 50.00;
Console.WriteLine("The amount to be subtracted from the pool and added " +
"to the account is ${0}", amountFromPool);
Console.WriteLine("---");
Console.WriteLine("Calling {0} ...", myMemberInfo[0].ToString());
Console.WriteLine("---");
object[] passMe = new object[] { thePool, amountFromPool };
Console.WriteLine("The new balance in the account instance is ${0}",
custType.InvokeMember("AddFundsFromPool",
BindingFlags.InvokeMethod,
null, custObj, passMe));
thePool = (double)passMe[0];
Console.WriteLine("The new amount in the pool is ${0}", thePool);
}
}
using namespace System;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
Type^ BuildCustomerDataType()
{
AppDomain^ myDomain = Thread::GetDomain();
AssemblyName^ myAsmName = gcnew AssemblyName;
myAsmName->Name = "MyDynamicAssembly";
AssemblyBuilder^ myAsmBuilder = myDomain->DefineDynamicAssembly( myAsmName, AssemblyBuilderAccess::Run );
ModuleBuilder^ myModBuilder = myAsmBuilder->DefineDynamicModule( "MyMod" );
TypeBuilder^ myTypeBuilder = myModBuilder->DefineType( "CustomerData", TypeAttributes::Public );
FieldBuilder^ customerNameBldr = myTypeBuilder->DefineField( "customerName", String::typeid, FieldAttributes::Private );
FieldBuilder^ acctIDBldr = myTypeBuilder->DefineField( "acctID", String::typeid, FieldAttributes::Private );
FieldBuilder^ balanceAmtBldr = myTypeBuilder->DefineField( "balanceAmt", double::typeid, FieldAttributes::Private );
array<Type^>^temp0 = {String::typeid,String::typeid,double::typeid};
ConstructorBuilder^ myCtorBuilder = myTypeBuilder->DefineConstructor( MethodAttributes::Public, CallingConventions::HasThis, temp0 );
ILGenerator^ ctorIL = myCtorBuilder->GetILGenerator();
Type^ objType = Type::GetType( "System.Object" );
ConstructorInfo^ objCtor = objType->GetConstructor( gcnew array<Type^>(0) );
ctorIL->Emit( OpCodes::Ldarg_0 );
ctorIL->Emit( OpCodes::Call, objCtor );
ctorIL->Emit( OpCodes::Ldarg_0 );
ctorIL->Emit( OpCodes::Ldarg_1 );
ctorIL->Emit( OpCodes::Stfld, customerNameBldr );
ctorIL->Emit( OpCodes::Ldarg_0 );
ctorIL->Emit( OpCodes::Ldarg_2 );
ctorIL->Emit( OpCodes::Stfld, acctIDBldr );
ctorIL->Emit( OpCodes::Ldarg_0 );
ctorIL->Emit( OpCodes::Ldarg_3 );
ctorIL->Emit( OpCodes::Stfld, balanceAmtBldr );
ctorIL->Emit( OpCodes::Ret );
// This method will take an amount from a static pool and add it to the balance.
// Note that we are passing the first parameter, fundsPool, by reference. Therefore,
// we need to inform the MethodBuilder to expect a ref, by declaring the first
// parameter's type to be System::Double& (a reference to a double).
array<Type^>^temp4 = {Type::GetType( "System.Double&" ),double::typeid};
MethodBuilder^ myMthdBuilder = myTypeBuilder->DefineMethod( "AddFundsFromPool", MethodAttributes::Public, double::typeid, temp4 );
ParameterBuilder^ poolRefBuilder = myMthdBuilder->DefineParameter( 1, ParameterAttributes::Out, "fundsPool" );
ParameterBuilder^ amountFromPoolBuilder = myMthdBuilder->DefineParameter( 2, ParameterAttributes::In, "amountFromPool" );
ILGenerator^ mthdIL = myMthdBuilder->GetILGenerator();
mthdIL->Emit( OpCodes::Ldarg_1 );
mthdIL->Emit( OpCodes::Ldarg_1 );
mthdIL->Emit( OpCodes::Ldind_R8 );
mthdIL->Emit( OpCodes::Ldarg_2 );
mthdIL->Emit( OpCodes::Sub );
mthdIL->Emit( OpCodes::Stind_R8 );
mthdIL->Emit( OpCodes::Ldarg_0 );
mthdIL->Emit( OpCodes::Ldarg_0 );
mthdIL->Emit( OpCodes::Ldfld, balanceAmtBldr );
mthdIL->Emit( OpCodes::Ldarg_2 );
mthdIL->Emit( OpCodes::Add );
mthdIL->Emit( OpCodes::Stfld, balanceAmtBldr );
mthdIL->Emit( OpCodes::Ldarg_0 );
mthdIL->Emit( OpCodes::Ldfld, balanceAmtBldr );
mthdIL->Emit( OpCodes::Ret );
return myTypeBuilder->CreateType();
}
int main()
{
Type^ custType = nullptr;
Object^ custObj = nullptr;
array<Type^>^custArgTypes = {String::typeid,String::typeid,double::typeid};
// Call the method to build our dynamic class.
custType = BuildCustomerDataType();
Console::WriteLine( "---" );
ConstructorInfo^ myCustCtor = custType->GetConstructor( custArgTypes );
double initialBalance = 100.00;
array<Object^>^temp5 = {"Joe Consumer","5678-XYZ",initialBalance};
custObj = myCustCtor->Invoke( temp5 );
array<MemberInfo^>^myMemberInfo = custType->GetMember( "AddFundsFromPool" );
double thePool = 1000.00;
Console::WriteLine( "The pool is currently ${0}", thePool );
Console::WriteLine( "The original balance of the account instance is ${0}", initialBalance );
double amountFromPool = 50.00;
Console::WriteLine( "The amount to be subtracted from the pool and added to the account is ${0}", amountFromPool );
Console::WriteLine( "---" );
Console::WriteLine( "Calling {0} ...", myMemberInfo[ 0 ] );
Console::WriteLine( "---" );
array<Object^>^passMe = {thePool,amountFromPool};
Console::WriteLine( "The new balance in the account instance is ${0}", custType->InvokeMember( "AddFundsFromPool", BindingFlags::InvokeMethod, nullptr, custObj, passMe ) );
thePool = safe_cast<double>(passMe[ 0 ]);
Console::WriteLine( "The new amount in the pool is ${0}", thePool );
}
import System.*;
import System.Threading.*;
import System.Reflection.*;
import System.Reflection.Emit.*;
class ParamBuilderDemo
{
public static Type BuildCustomerDataType()
{
AppDomain myDomain = System.Threading.Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.set_Name("MyDynamicAssembly");
AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly
(myAsmName, AssemblyBuilderAccess.Run);
ModuleBuilder myModBuilder = myAsmBuilder.DefineDynamicModule("MyMod");
TypeBuilder myTypeBuilder = myModBuilder.DefineType("CustomerData",
TypeAttributes.Public);
FieldBuilder customerNameBldr = myTypeBuilder.DefineField
("customerName", String.class.ToType(), FieldAttributes.Private);
FieldBuilder acctIDBldr = myTypeBuilder.DefineField("acctID",
String.class.ToType(), FieldAttributes.Private);
FieldBuilder balanceAmtBldr = myTypeBuilder.DefineField("balanceAmt",
double.class.ToType(), FieldAttributes.Private);
ConstructorBuilder myCtorBuilder = myTypeBuilder.DefineConstructor
(MethodAttributes.Public, CallingConventions.HasThis,
new Type[]{String.class.ToType(), String.class.ToType(),
double.class.ToType()});
ILGenerator ctorIL = myCtorBuilder.GetILGenerator();
Type objType = Type.GetType("System.Object");
ConstructorInfo objCtor = objType.GetConstructor(new Type[]{});
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Call, objCtor);
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Ldarg_1);
ctorIL.Emit(OpCodes.Stfld, customerNameBldr);
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Ldarg_2);
ctorIL.Emit(OpCodes.Stfld, acctIDBldr);
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Ldarg_3);
ctorIL.Emit(OpCodes.Stfld, balanceAmtBldr);
ctorIL.Emit(OpCodes.Ret);
// This method will take an amount from a static pool and add it
// to the balance. Note that we are passing the first parameter,
//fundsPool, by reference. Therefore,we need to inform the
// MethodBuilder to expect a ref, by declaring the first
// parameter's type to be System.Double& (a reference to a double).
MethodBuilder myMthdBuilder = myTypeBuilder.DefineMethod
("AddFundsFromPool", MethodAttributes.Public,
double.class.ToType(),
new Type[]{Type.GetType("System.Double&"),
double.class.ToType()});
ParameterBuilder poolRefBuilder = myMthdBuilder.DefineParameter(1,
ParameterAttributes.Out, "fundsPool");
ParameterBuilder amountFromPoolBuilder =
myMthdBuilder.DefineParameter(2, ParameterAttributes.In,
"amountFromPool");
ILGenerator mthdIL = myMthdBuilder.GetILGenerator();
mthdIL.Emit(OpCodes.Ldarg_1);
mthdIL.Emit(OpCodes.Ldarg_1);
mthdIL.Emit(OpCodes.Ldind_R8);
mthdIL.Emit(OpCodes.Ldarg_2);
mthdIL.Emit(OpCodes.Sub);
mthdIL.Emit(OpCodes.Stind_R8);
mthdIL.Emit(OpCodes.Ldarg_0);
mthdIL.Emit(OpCodes.Ldarg_0);
mthdIL.Emit(OpCodes.Ldfld, balanceAmtBldr);
mthdIL.Emit(OpCodes.Ldarg_2);
mthdIL.Emit(OpCodes.Add);
mthdIL.Emit(OpCodes.Stfld, balanceAmtBldr);
mthdIL.Emit(OpCodes.Ldarg_0);
mthdIL.Emit(OpCodes.Ldfld, balanceAmtBldr);
mthdIL.Emit(OpCodes.Ret);
return myTypeBuilder.CreateType() ;
} //BuildCustomerDataType
public static void main(String[] args)
{
Type custType = null;
Object custObj = null;
Type custArgTypes[] = new Type[]{String.class.ToType(),
String.class.ToType(), double.class.ToType()};
// Call the method to build our dynamic class.
custType = BuildCustomerDataType();
Console.WriteLine("---");
ConstructorInfo myCustCtor = custType.GetConstructor(custArgTypes);
double initialBalance = 100.0;
custObj = myCustCtor.Invoke(new Object[]{"Joe Consumer", "5678-XYZ",
(System.Double)(initialBalance)});
MemberInfo myMemberInfo[] = custType.GetMember("AddFundsFromPool");
double thePool = 1000.0;
Console.WriteLine("The pool is currently ${0}",
System.Convert.ToString(thePool));
Console.WriteLine(
"The original balance of the account instance is ${0}",
new Object[] { (System.Double)(initialBalance) });
double amountFromPool = 50.0;
Console.WriteLine("The amount to be subtracted from the pool and added"
+ " to the account is ${0}", (System.Double)(amountFromPool));
Console.WriteLine("---");
Console.WriteLine("Calling {0} ...",
myMemberInfo .get_Item( 0).ToString());
Console.WriteLine("---");
Object passMe[] = new Object[] { (System.Double)(thePool),
(System.Double)(amountFromPool) };
Console.WriteLine("The new balance in the account instance is ${0}",
custType.InvokeMember("AddFundsFromPool",
BindingFlags.InvokeMethod, null, custObj, passMe));
thePool = (double)Double.parseDouble(passMe[0].toString());
Console.WriteLine("The new amount in the pool is ${0}",
(System.Double)(thePool));
} //main
} //ParamBuilderDemo
상속 계층 구조
System.Object
System.Reflection.Emit.ParameterBuilder
스레드로부터의 안전성
이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.
플랫폼
Windows 98, Windows 2000 SP4, Windows Millennium Edition, 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에서 지원