TypeBuilder.DefineMethod Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Добавляет метод в тип.
Перегрузки
| Имя | Описание |
|---|---|
| DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][]) |
Добавляет новый метод в тип с указанным именем, атрибутами метода, соглашением о вызовах, сигнатурой метода и настраиваемыми модификаторами. |
| DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[]) |
Добавляет новый метод в тип с указанным именем, атрибутами метода, соглашением о вызовах и сигнатурой метода. |
| DefineMethod(String, MethodAttributes, CallingConventions) |
Добавляет новый метод в тип с указанным именем, атрибутами метода и соглашением о вызовах. |
| DefineMethod(String, MethodAttributes) |
Добавляет новый метод в тип с указанными атрибутами имени и метода. |
| DefineMethod(String, MethodAttributes, Type, Type[]) |
Добавляет новый метод в тип с указанным именем, атрибутами метода и сигнатурой метода. |
DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[], Type[], Type[], Type[][], Type[][])
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
Добавляет новый метод в тип с указанным именем, атрибутами метода, соглашением о вызовах, сигнатурой метода и настраиваемыми модификаторами.
public:
System::Reflection::Emit::MethodBuilder ^ DefineMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ returnTypeRequiredCustomModifiers, cli::array <Type ^> ^ returnTypeOptionalCustomModifiers, cli::array <Type ^> ^ parameterTypes, cli::array <cli::array <Type ^> ^> ^ parameterTypeRequiredCustomModifiers, cli::array <cli::array <Type ^> ^> ^ parameterTypeOptionalCustomModifiers);
public System.Reflection.Emit.MethodBuilder DefineMethod(string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? returnTypeRequiredCustomModifiers, Type[]? returnTypeOptionalCustomModifiers, Type[]? parameterTypes, Type[][]? parameterTypeRequiredCustomModifiers, Type[][]? parameterTypeOptionalCustomModifiers);
public System.Reflection.Emit.MethodBuilder DefineMethod(string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] returnTypeRequiredCustomModifiers, Type[] returnTypeOptionalCustomModifiers, Type[] parameterTypes, Type[][] parameterTypeRequiredCustomModifiers, Type[][] parameterTypeOptionalCustomModifiers);
member this.DefineMethod : string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] * Type[] * Type[] * Type[][] * Type[][] -> System.Reflection.Emit.MethodBuilder
Public Function DefineMethod (name As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, returnTypeRequiredCustomModifiers As Type(), returnTypeOptionalCustomModifiers As Type(), parameterTypes As Type(), parameterTypeRequiredCustomModifiers As Type()(), parameterTypeOptionalCustomModifiers As Type()()) As MethodBuilder
Параметры
- name
- String
Имя метода.
name не может содержать внедренные значения NULL.
- attributes
- MethodAttributes
Атрибуты метода.
- callingConvention
- CallingConventions
Соглашение о вызове метода.
- returnType
- Type
Возвращаемый тип метода.
- returnTypeRequiredCustomModifiers
- Type[]
Массив типов, представляющих необходимые настраиваемые модификаторы, например IsConstдля возвращаемого типа метода. Если возвращаемый тип не имеет обязательных настраиваемых модификаторов, укажите null.
- returnTypeOptionalCustomModifiers
- Type[]
Массив типов, представляющих необязательные настраиваемые модификаторы, например IsConstдля возвращаемого типа метода. Если возвращаемый тип не имеет необязательных настраиваемых модификаторов, укажите null.
- parameterTypes
- Type[]
Типы параметров метода.
- parameterTypeRequiredCustomModifiers
- Type[][]
Массив массивов типов. Каждый массив типов представляет обязательные настраиваемые модификаторы для соответствующего параметра, например IsConst. Если определенный параметр не имеет обязательных настраиваемых модификаторов, укажите null вместо массива типов. Если ни один из параметров не требует пользовательских модификаторов, укажите null вместо массива массивов.
- parameterTypeOptionalCustomModifiers
- Type[][]
Массив массивов типов. Каждый массив типов представляет необязательные настраиваемые модификаторы для соответствующего параметра, например IsConst. Если определенный параметр не имеет необязательных настраиваемых модификаторов, укажите null вместо массива типов. Если ни один из параметров не имеет необязательных настраиваемых модификаторов, укажите null вместо массива массивов.
Возвращаемое значение
MethodBuilder Объект, представляющий только что добавленный метод.
Исключения
Длина name равно нулю.
–или–
Тип родительского элемента этого метода является интерфейсом, и этот метод не является виртуальным (Overridable в Visual Basic).
–или–
Размер parameterTypeRequiredCustomModifiers или parameterTypeOptionalCustomModifiers не равен размеру parameterTypes.
name равно null.
Тип был создан ранее с помощью CreateType().
–или–
Для текущего динамического типа свойство равноIsGenericType, true но IsGenericTypeDefinition свойство равноfalse.
Комментарии
Используйте эту перегрузку, если необходимо указать пользовательские модификаторы. Если необходимо указать настраиваемые модификаторы после создания метода, например с универсальным методом, типы параметров которого указываются параметрами универсального типа, можно использовать DefineMethod(String, MethodAttributes) перегрузки или DefineMethod(String, MethodAttributes, CallingConventions) методы для определения метода, а затем использовать MethodBuilder.SetSignature метод для определения параметра и возвращаемых типов с настраиваемыми модификаторами.
Note
Дополнительные сведения о пользовательских модификаторах см. в статьях ECMA C# и стандартных стандартах инфраструктуры clma-335 — инфраструктуре общего языка (CLI).
Применяется к
DefineMethod(String, MethodAttributes, CallingConventions, Type, Type[])
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
Добавляет новый метод в тип с указанным именем, атрибутами метода, соглашением о вызовах и сигнатурой метода.
public:
System::Reflection::Emit::MethodBuilder ^ DefineMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention, Type ^ returnType, cli::array <Type ^> ^ parameterTypes);
public System.Reflection.Emit.MethodBuilder DefineMethod(string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes);
public System.Reflection.Emit.MethodBuilder DefineMethod(string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention, Type returnType, Type[] parameterTypes);
member this.DefineMethod : string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions * Type * Type[] -> System.Reflection.Emit.MethodBuilder
Public Function DefineMethod (name As String, attributes As MethodAttributes, callingConvention As CallingConventions, returnType As Type, parameterTypes As Type()) As MethodBuilder
Параметры
- name
- String
Имя метода.
name не может содержать внедренные значения NULL.
- attributes
- MethodAttributes
Атрибуты метода.
- callingConvention
- CallingConventions
Соглашение о вызове метода.
- returnType
- Type
Возвращаемый тип метода.
- parameterTypes
- Type[]
Типы параметров метода.
Возвращаемое значение
Представляет MethodBuilder только что определенный метод.
Исключения
Длина name равно нулю.
–или–
Тип родительского элемента этого метода является интерфейсом, и этот метод не является виртуальным (Overridable в Visual Basic).
name равно null.
Тип был создан ранее с помощью CreateType().
–или–
Для текущего динамического типа свойство равноIsGenericType, true но IsGenericTypeDefinition свойство равноfalse.
Примеры
В следующем примере кода показано использование DefineMethod конкретной сигнатуры и атрибутов конструктора для динамического типа и возврата соответствующего MethodBuilder для совокупности MSIL.
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Security.Permissions;
public interface IMyInterface
{
String HelloMethod(String parameter);
}
public class Example
{
public static void Main()
{
Type myNestedClassType = CreateCallee(Thread.GetDomain());
// Cretae an instance of 'MyNestedClass'.
IMyInterface myInterface =
(IMyInterface)Activator.CreateInstance(myNestedClassType);
Console.WriteLine(myInterface.HelloMethod("Bill"));
}
// Create the callee transient dynamic assembly.
private static Type CreateCallee(AppDomain myAppDomain)
{
AssemblyName myAssemblyName = new AssemblyName();
myAssemblyName.Name = "Example";
// Create the callee dynamic assembly.
AssemblyBuilder myAssembly =
myAppDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run);
// Create a dynamic module in the callee assembly.
ModuleBuilder myModule = myAssembly.DefineDynamicModule("EmittedModule");
// Define a public class named "MyHelloWorld".
TypeBuilder myHelloWorldType =
myModule.DefineType("MyHelloWorld", TypeAttributes.Public);
// Define a public nested class named 'MyNestedClass'.
TypeBuilder myNestedClassType =
myHelloWorldType.DefineNestedType("MyNestedClass",
TypeAttributes.NestedPublic, typeof(Example),
new Type[]{typeof(IMyInterface)});
// Implement 'IMyInterface' interface.
myNestedClassType.AddInterfaceImplementation(typeof(IMyInterface));
// Define 'HelloMethod' of 'IMyInterface'.
MethodBuilder myHelloMethod =
myNestedClassType.DefineMethod("HelloMethod",
MethodAttributes.Public | MethodAttributes.Virtual,
typeof(String), new Type[]{typeof(String)});
// Generate IL for 'GetGreeting' method.
ILGenerator myMethodIL = myHelloMethod.GetILGenerator();
myMethodIL.Emit(OpCodes.Ldstr, "Hi! ");
myMethodIL.Emit(OpCodes.Ldarg_1);
MethodInfo infoMethod =
typeof(String).GetMethod("Concat",new Type[]{typeof(string),typeof(string)});
myMethodIL.Emit(OpCodes.Call, infoMethod);
myMethodIL.Emit(OpCodes.Ret);
MethodInfo myHelloMethodInfo =
typeof(IMyInterface).GetMethod("HelloMethod");
// Implement 'HelloMethod' of 'IMyInterface'.
myNestedClassType.DefineMethodOverride(myHelloMethod, myHelloMethodInfo);
// Create 'MyHelloWorld' type.
Type myType = myHelloWorldType.CreateType();
// Create 'MyNestedClass' type.
return myNestedClassType.CreateType();
}
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Security.Permissions
Public Interface IMyInterface
Function HelloMethod(parameter As String) As String
End Interface 'IMyInterface
Public Class Example
<PermissionSetAttribute(SecurityAction.Demand, Name:="FullTrust")> _
Public Shared Sub Main()
Dim myNestedClassType As Type = CreateCallee(Thread.GetDomain())
' Create an instance of 'MyNestedClass'.
Dim myInterface As IMyInterface = _
CType(Activator.CreateInstance(myNestedClassType), IMyInterface)
Console.WriteLine(myInterface.HelloMethod("Bill"))
End Sub
' Create the callee transient dynamic assembly.
Private Shared Function CreateCallee(myAppDomain As AppDomain) As Type
Dim myAssemblyName As New AssemblyName()
myAssemblyName.Name = "Example"
' Create the callee dynamic assembly.
Dim myAssembly As AssemblyBuilder = _
myAppDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run)
' Create a dynamic module in the callee assembly.
Dim myModule As ModuleBuilder = myAssembly.DefineDynamicModule("EmittedModule")
' Define a public class named "MyHelloWorld".
Dim myHelloWorldType As TypeBuilder = _
myModule.DefineType("MyHelloWorld", TypeAttributes.Public)
' Define a public nested class named 'MyNestedClass'.
Dim myNestedClassType As TypeBuilder = _
myHelloWorldType.DefineNestedType("MyNestedClass", TypeAttributes.NestedPublic, _
GetType(Example), New Type() {GetType(IMyInterface)})
' Implement 'IMyInterface' interface.
myNestedClassType.AddInterfaceImplementation(GetType(IMyInterface))
' Define 'HelloMethod' of 'IMyInterface'.
Dim myHelloMethod As MethodBuilder = _
myNestedClassType.DefineMethod("HelloMethod", MethodAttributes.Public Or _
MethodAttributes.Virtual, GetType(String), New Type() {GetType(String)})
' Generate IL for 'GetGreeting' method.
Dim myMethodIL As ILGenerator = myHelloMethod.GetILGenerator()
myMethodIL.Emit(OpCodes.Ldstr, "Hi! ")
myMethodIL.Emit(OpCodes.Ldarg_1)
Dim infoMethod As MethodInfo = _
GetType(String).GetMethod("Concat", New Type() {GetType(String), GetType(String)})
myMethodIL.Emit(OpCodes.Call, infoMethod)
myMethodIL.Emit(OpCodes.Ret)
Dim myHelloMethodInfo As MethodInfo = GetType(IMyInterface).GetMethod("HelloMethod")
' Implement 'HelloMethod' of 'IMyInterface'.
myNestedClassType.DefineMethodOverride(myHelloMethod, myHelloMethodInfo)
' Create 'MyHelloWorld' type.
Dim myType As Type = myHelloWorldType.CreateType()
' Create 'MyNestedClass' type.
Return myNestedClassType.CreateType()
End Function 'CreateCallee
End Class
Применяется к
DefineMethod(String, MethodAttributes, CallingConventions)
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
Добавляет новый метод в тип с указанным именем, атрибутами метода и соглашением о вызовах.
public:
System::Reflection::Emit::MethodBuilder ^ DefineMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, System::Reflection::CallingConventions callingConvention);
public System.Reflection.Emit.MethodBuilder DefineMethod(string name, System.Reflection.MethodAttributes attributes, System.Reflection.CallingConventions callingConvention);
member this.DefineMethod : string * System.Reflection.MethodAttributes * System.Reflection.CallingConventions -> System.Reflection.Emit.MethodBuilder
Public Function DefineMethod (name As String, attributes As MethodAttributes, callingConvention As CallingConventions) As MethodBuilder
Параметры
- name
- String
Имя метода.
name не может содержать внедренные значения NULL.
- attributes
- MethodAttributes
Атрибуты метода.
- callingConvention
- CallingConventions
Соглашение о вызове метода.
Возвращаемое значение
Представляет MethodBuilder только что определенный метод.
Исключения
Длина name равно нулю.
–или–
Тип родительского элемента этого метода является интерфейсом, и этот метод не является виртуальным (Overridable в Visual Basic).
name равно null.
Тип был создан ранее с помощью CreateType().
–или–
Для текущего динамического типа свойство равноIsGenericType, true но IsGenericTypeDefinition свойство равноfalse.
Комментарии
Используйте эту перегрузку метода, если вы не знаете сигнатуру метода во время определения метода. Например, типы параметров и возвращаемый тип универсального метода могут быть указаны параметрами универсального типа метода, которые должны быть определены после добавления метода в тип. Параметры и возвращаемый тип метода можно задать позже с помощью MethodBuilder.SetSignature метода.
См. также раздел
Применяется к
DefineMethod(String, MethodAttributes)
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
Добавляет новый метод в тип с указанными атрибутами имени и метода.
public:
System::Reflection::Emit::MethodBuilder ^ DefineMethod(System::String ^ name, System::Reflection::MethodAttributes attributes);
public System.Reflection.Emit.MethodBuilder DefineMethod(string name, System.Reflection.MethodAttributes attributes);
member this.DefineMethod : string * System.Reflection.MethodAttributes -> System.Reflection.Emit.MethodBuilder
Public Function DefineMethod (name As String, attributes As MethodAttributes) As MethodBuilder
Параметры
- name
- String
Имя метода.
name не может содержать внедренные значения NULL.
- attributes
- MethodAttributes
Атрибуты метода.
Возвращаемое значение
Представляет MethodBuilder только что определенный метод.
Исключения
Длина name равно нулю.
–или–
Тип родительского элемента этого метода является интерфейсом, и этот метод не является виртуальным (Overridable в Visual Basic).
name равно null.
Тип был создан ранее с помощью CreateType().
–или–
Для текущего динамического типа свойство равноIsGenericType, true но IsGenericTypeDefinition свойство равноfalse.
Примеры
В следующем примере кода определяется универсальный метод с именем DemoMethod типа параметра и возвращаемого типа, заданные параметрами универсального типа. Метод определяется без подписи, используя стандартное соглашение о вызовах. Этот MethodBuilder.DefineGenericParameters метод используется для создания DemoMethod универсального метода, а затем для сигнатуры и возвращаемого типа используются новые параметры типа.
Этот пример кода является частью более крупного примера, предоставленного DefineGenericParameters для метода.
// Define a Shared, Public method with standard calling
// conventions. Do not specify the parameter types or the
// return type, because type parameters will be used for
// those types, and the type parameters have not been
// defined yet.
MethodBuilder demoMethod = demoType.DefineMethod(
"DemoMethod",
MethodAttributes.Public | MethodAttributes.Static
);
' Define a Shared, Public method with standard calling
' conventions. Do not specify the parameter types or the
' return type, because type parameters will be used for
' those types, and the type parameters have not been
' defined yet.
Dim demoMethod As MethodBuilder = _
demoType.DefineMethod("DemoMethod", _
MethodAttributes.Public Or MethodAttributes.Static)
// Defining generic parameters for the method makes it a
// generic method. By convention, type parameters are
// single alphabetic characters. T and U are used here.
//
string[] typeParamNames = {"T", "U"};
GenericTypeParameterBuilder[] typeParameters =
demoMethod.DefineGenericParameters(typeParamNames);
// The second type parameter is constrained to be a
// reference type.
typeParameters[1].SetGenericParameterAttributes(
GenericParameterAttributes.ReferenceTypeConstraint);
' Defining generic parameters for the method makes it a
' generic method. By convention, type parameters are
' single alphabetic characters. T and U are used here.
'
Dim typeParamNames() As String = {"T", "U"}
Dim typeParameters() As GenericTypeParameterBuilder = _
demoMethod.DefineGenericParameters(typeParamNames)
' The second type parameter is constrained to be a
' reference type.
typeParameters(1).SetGenericParameterAttributes( _
GenericParameterAttributes.ReferenceTypeConstraint)
// Set parameter types for the method. The method takes
// one parameter, and its type is specified by the first
// type parameter, T.
Type[] parms = {typeParameters[0]};
demoMethod.SetParameters(parms);
// Set the return type for the method. The return type is
// specified by the second type parameter, U.
demoMethod.SetReturnType(typeParameters[1]);
' Set parameter types for the method. The method takes
' one parameter, and its type is specified by the first
' type parameter, T.
Dim params() As Type = {typeParameters(0)}
demoMethod.SetParameters(params)
' Set the return type for the method. The return type is
' specified by the second type parameter, U.
demoMethod.SetReturnType(typeParameters(1))
Комментарии
Используйте эту перегрузку метода, если вы не знаете сигнатуру метода во время определения метода. Например, типы параметров и возвращаемый тип универсального метода могут быть указаны параметрами универсального типа метода, которые должны быть определены после добавления метода в тип. Параметры и возвращаемый тип метода можно задать позже с помощью MethodBuilder.SetSignature метода.
Эта перегрузка метода определяет метод с CallingConventions.Standard. Если необходимо определить метод без сигнатуры, используя другое соглашение о вызовах, используйте перегрузку DefineMethod(String, MethodAttributes, CallingConventions) метода.
См. также раздел
Применяется к
DefineMethod(String, MethodAttributes, Type, Type[])
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
- Исходный код:
- TypeBuilder.cs
Добавляет новый метод в тип с указанным именем, атрибутами метода и сигнатурой метода.
public:
System::Reflection::Emit::MethodBuilder ^ DefineMethod(System::String ^ name, System::Reflection::MethodAttributes attributes, Type ^ returnType, cli::array <Type ^> ^ parameterTypes);
public System.Reflection.Emit.MethodBuilder DefineMethod(string name, System.Reflection.MethodAttributes attributes, Type? returnType, Type[]? parameterTypes);
public System.Reflection.Emit.MethodBuilder DefineMethod(string name, System.Reflection.MethodAttributes attributes, Type returnType, Type[] parameterTypes);
member this.DefineMethod : string * System.Reflection.MethodAttributes * Type * Type[] -> System.Reflection.Emit.MethodBuilder
Public Function DefineMethod (name As String, attributes As MethodAttributes, returnType As Type, parameterTypes As Type()) As MethodBuilder
Параметры
- name
- String
Имя метода.
name не может содержать внедренные значения NULL.
- attributes
- MethodAttributes
Атрибуты метода.
- returnType
- Type
Возвращаемый тип метода.
- parameterTypes
- Type[]
Типы параметров метода.
Возвращаемое значение
Определенный метод.
Исключения
Длина name равно нулю.
–или–
Тип родительского элемента этого метода является интерфейсом, и этот метод не является виртуальным (Overridable в Visual Basic).
name равно null.
Тип был создан ранее с помощью CreateType().
–или–
Для текущего динамического типа свойство равноIsGenericType, true но IsGenericTypeDefinition свойство равноfalse.
Примеры
В следующем примере кода показано использование DefineMethod конкретной сигнатуры и атрибутов конструктора для динамического типа и возврата соответствующего MethodBuilder для совокупности MSIL.
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Security.Permissions;
public interface IMyInterface
{
String HelloMethod(String parameter);
}
public class Example
{
public static void Main()
{
Type myNestedClassType = CreateCallee(Thread.GetDomain());
// Cretae an instance of 'MyNestedClass'.
IMyInterface myInterface =
(IMyInterface)Activator.CreateInstance(myNestedClassType);
Console.WriteLine(myInterface.HelloMethod("Bill"));
}
// Create the callee transient dynamic assembly.
private static Type CreateCallee(AppDomain myAppDomain)
{
AssemblyName myAssemblyName = new AssemblyName();
myAssemblyName.Name = "Example";
// Create the callee dynamic assembly.
AssemblyBuilder myAssembly =
myAppDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run);
// Create a dynamic module in the callee assembly.
ModuleBuilder myModule = myAssembly.DefineDynamicModule("EmittedModule");
// Define a public class named "MyHelloWorld".
TypeBuilder myHelloWorldType =
myModule.DefineType("MyHelloWorld", TypeAttributes.Public);
// Define a public nested class named 'MyNestedClass'.
TypeBuilder myNestedClassType =
myHelloWorldType.DefineNestedType("MyNestedClass",
TypeAttributes.NestedPublic, typeof(Example),
new Type[]{typeof(IMyInterface)});
// Implement 'IMyInterface' interface.
myNestedClassType.AddInterfaceImplementation(typeof(IMyInterface));
// Define 'HelloMethod' of 'IMyInterface'.
MethodBuilder myHelloMethod =
myNestedClassType.DefineMethod("HelloMethod",
MethodAttributes.Public | MethodAttributes.Virtual,
typeof(String), new Type[]{typeof(String)});
// Generate IL for 'GetGreeting' method.
ILGenerator myMethodIL = myHelloMethod.GetILGenerator();
myMethodIL.Emit(OpCodes.Ldstr, "Hi! ");
myMethodIL.Emit(OpCodes.Ldarg_1);
MethodInfo infoMethod =
typeof(String).GetMethod("Concat",new Type[]{typeof(string),typeof(string)});
myMethodIL.Emit(OpCodes.Call, infoMethod);
myMethodIL.Emit(OpCodes.Ret);
MethodInfo myHelloMethodInfo =
typeof(IMyInterface).GetMethod("HelloMethod");
// Implement 'HelloMethod' of 'IMyInterface'.
myNestedClassType.DefineMethodOverride(myHelloMethod, myHelloMethodInfo);
// Create 'MyHelloWorld' type.
Type myType = myHelloWorldType.CreateType();
// Create 'MyNestedClass' type.
return myNestedClassType.CreateType();
}
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Security.Permissions
Public Interface IMyInterface
Function HelloMethod(parameter As String) As String
End Interface 'IMyInterface
Public Class Example
<PermissionSetAttribute(SecurityAction.Demand, Name:="FullTrust")> _
Public Shared Sub Main()
Dim myNestedClassType As Type = CreateCallee(Thread.GetDomain())
' Create an instance of 'MyNestedClass'.
Dim myInterface As IMyInterface = _
CType(Activator.CreateInstance(myNestedClassType), IMyInterface)
Console.WriteLine(myInterface.HelloMethod("Bill"))
End Sub
' Create the callee transient dynamic assembly.
Private Shared Function CreateCallee(myAppDomain As AppDomain) As Type
Dim myAssemblyName As New AssemblyName()
myAssemblyName.Name = "Example"
' Create the callee dynamic assembly.
Dim myAssembly As AssemblyBuilder = _
myAppDomain.DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.Run)
' Create a dynamic module in the callee assembly.
Dim myModule As ModuleBuilder = myAssembly.DefineDynamicModule("EmittedModule")
' Define a public class named "MyHelloWorld".
Dim myHelloWorldType As TypeBuilder = _
myModule.DefineType("MyHelloWorld", TypeAttributes.Public)
' Define a public nested class named 'MyNestedClass'.
Dim myNestedClassType As TypeBuilder = _
myHelloWorldType.DefineNestedType("MyNestedClass", TypeAttributes.NestedPublic, _
GetType(Example), New Type() {GetType(IMyInterface)})
' Implement 'IMyInterface' interface.
myNestedClassType.AddInterfaceImplementation(GetType(IMyInterface))
' Define 'HelloMethod' of 'IMyInterface'.
Dim myHelloMethod As MethodBuilder = _
myNestedClassType.DefineMethod("HelloMethod", MethodAttributes.Public Or _
MethodAttributes.Virtual, GetType(String), New Type() {GetType(String)})
' Generate IL for 'GetGreeting' method.
Dim myMethodIL As ILGenerator = myHelloMethod.GetILGenerator()
myMethodIL.Emit(OpCodes.Ldstr, "Hi! ")
myMethodIL.Emit(OpCodes.Ldarg_1)
Dim infoMethod As MethodInfo = _
GetType(String).GetMethod("Concat", New Type() {GetType(String), GetType(String)})
myMethodIL.Emit(OpCodes.Call, infoMethod)
myMethodIL.Emit(OpCodes.Ret)
Dim myHelloMethodInfo As MethodInfo = GetType(IMyInterface).GetMethod("HelloMethod")
' Implement 'HelloMethod' of 'IMyInterface'.
myNestedClassType.DefineMethodOverride(myHelloMethod, myHelloMethodInfo)
' Create 'MyHelloWorld' type.
Dim myType As Type = myHelloWorldType.CreateType()
' Create 'MyNestedClass' type.
Return myNestedClassType.CreateType()
End Function 'CreateCallee
End Class