AssemblyBuilder.DefineDynamicModule 方法

定义

在此程序集中定义动态模块。

重载

DefineDynamicModule(String)

在此程序集中定义一个命名的暂时性动态模块。

DefineDynamicModule(String, Boolean)

在此程序集中定义一个命名的暂时性动态模块,并指定是否应发出符号信息。

DefineDynamicModule(String, String)

使用将保存到指定文件的名称定义持久动态模块。 未发出符号信息。

DefineDynamicModule(String, String, Boolean)

定义一个持久动态模块,指定模块名称、将保存模块的文件的名称,以及是否应使用默认符号编写器发出符号信息。

DefineDynamicModule(String)

Source:
AssemblyBuilder.cs
Source:
AssemblyBuilder.cs
Source:
AssemblyBuilder.cs

在此程序集中定义一个命名的暂时性动态模块。

public:
 System::Reflection::Emit::ModuleBuilder ^ DefineDynamicModule(System::String ^ name);
public System.Reflection.Emit.ModuleBuilder DefineDynamicModule (string name);
member this.DefineDynamicModule : string -> System.Reflection.Emit.ModuleBuilder
Public Function DefineDynamicModule (name As String) As ModuleBuilder

参数

name
String

动态模块的名称。

返回

表示定义的动态模块的 ModuleBuilder

例外

name 以空格开头。

-或-

name 的长度为零。

-或-

name 的长度大于系统定义的最大长度。

-或-

仅限 .NET Framework:此程序集中已定义具有相同 name 的模块。

name null

仅限 .NET Core 和 .NET 5+ :此程序集中已定义动态模块。

调用方没有所需的权限。

无法加载默认符号编写器的程序集。

-或-

找不到实现默认符号编写器接口的类型。

示例

下面的代码示例演示如何使用 DefineDynamicModule创建暂时性动态模块。

AppDomain^ myAppDomain = Thread::GetDomain();
AssemblyName^ myAsmName = gcnew AssemblyName;
myAsmName->Name = "MyAssembly";
AssemblyBuilder^ myAsmBuilder = myAppDomain->DefineDynamicAssembly(
   myAsmName, AssemblyBuilderAccess::Run );

// Create a transient dynamic module. Since no DLL name is specified with
// this constructor, it cannot be saved.
ModuleBuilder^ myModuleBuilder = myAsmBuilder->DefineDynamicModule( "MyModule1" );
AppDomain myAppDomain = Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = "MyAssembly";
AssemblyBuilder myAsmBuilder = myAppDomain.DefineDynamicAssembly(
                     myAsmName,
                     AssemblyBuilderAccess.Run);

// Create a transient dynamic module. Since no DLL name is specified with
// this constructor, it can not be saved.
ModuleBuilder myModuleBuilder = myAsmBuilder.DefineDynamicModule("MyModule1");
Dim myAppDomain As AppDomain = Thread.GetDomain()
Dim myAsmName As New AssemblyName()
myAsmName.Name = "MyAssembly"
Dim myAsmBuilder As AssemblyBuilder = myAppDomain.DefineDynamicAssembly(myAsmName, _
                      AssemblyBuilderAccess.Run)

' Create a transient dynamic module. Since no DLL name is specified with
' this constructor, it can not be saved. 
Dim myModuleBuilder As ModuleBuilder = myAsmBuilder.DefineDynamicModule("MyModule1")

注解

仅 .NET Core 和 .NET 5+ :不支持 多模块程序集。 程序集中只能定义一个动态模块。

仅限 .NET Framework:定义程序集中同名的多个动态模块是错误的。

定义的动态模块是暂时性的。 即使使用 RunAndSave创建父动态程序集,也不会保存动态模块。

注意

若要在调试动态模块时取消优化,在调用 DefineDynamicModule之前,将 DebuggableAttribute 属性应用于动态程序集。 使用 DisableOptimizations 标志创建 DebuggableAttribute 实例,并使用 SetCustomAttribute 方法应用它。 该属性必须应用于动态程序集。 如果应用于模块,则不起作用。

注意

从 .NET Framework 2.0 Service Pack 1 开始,此成员不再需要具有 ReflectionPermissionFlag.ReflectionEmit 标志 ReflectionPermission。 (请参阅反射发出中的 安全问题。若要使用此功能,应用程序应面向 .NET Framework 3.5 或更高版本。

适用于

DefineDynamicModule(String, Boolean)

在此程序集中定义一个命名的暂时性动态模块,并指定是否应发出符号信息。

public:
 System::Reflection::Emit::ModuleBuilder ^ DefineDynamicModule(System::String ^ name, bool emitSymbolInfo);
public System.Reflection.Emit.ModuleBuilder DefineDynamicModule (string name, bool emitSymbolInfo);
member this.DefineDynamicModule : string * bool -> System.Reflection.Emit.ModuleBuilder
Public Function DefineDynamicModule (name As String, emitSymbolInfo As Boolean) As ModuleBuilder

参数

name
String

动态模块的名称。

emitSymbolInfo
Boolean

如果要发出符号信息,true;否则,false

返回

表示定义的动态模块的 ModuleBuilder

例外

name 以空格开头。

-或-

name 的长度为零。

-或-

name 的长度大于系统定义的最大长度。

name null

无法加载默认符号编写器的程序集。

-或-

找不到实现默认符号编写器接口的类型。

调用方没有所需的权限。

示例

下面的代码示例演示如何使用 DefineDynamicModule创建暂时性动态模块,从而抑制符号信息。

AppDomain^ myAppDomain = Thread::GetDomain();
AssemblyName^ myAsmName = gcnew AssemblyName;
myAsmName->Name = "MyAssembly";
AssemblyBuilder^ myAsmBuilder = myAppDomain->DefineDynamicAssembly(
   myAsmName, AssemblyBuilderAccess::Run );

// Create a transient dynamic module. Since no DLL name is specified with
// this constructor, it can not be saved. By specifying the second parameter
// of the constructor as false, we can suppress the emission of symbol info.
ModuleBuilder^ myModuleBuilder = myAsmBuilder->DefineDynamicModule(
   "MyModule2", false );
AppDomain myAppDomain = Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = "MyAssembly";
AssemblyBuilder myAsmBuilder = myAppDomain.DefineDynamicAssembly(
                     myAsmName,
                     AssemblyBuilderAccess.Run);

// Create a transient dynamic module. Since no DLL name is specified with
// this constructor, it can not be saved. By specifying the second parameter
// of the constructor as false, we can suppress the emission of symbol info.
ModuleBuilder myModuleBuilder = myAsmBuilder.DefineDynamicModule("MyModule2",
                                 false);
Dim myAppDomain As AppDomain = Thread.GetDomain()
Dim myAsmName As New AssemblyName()
myAsmName.Name = "MyAssembly"
Dim myAsmBuilder As AssemblyBuilder = myAppDomain.DefineDynamicAssembly(myAsmName, _
                      AssemblyBuilderAccess.Run)

' Create a transient dynamic module. Since no DLL name is specified with
' this constructor, it can not be saved. By specifying the second parameter
' of the constructor as false, we can suppress the emission of symbol info.
Dim myModuleBuilder As ModuleBuilder = myAsmBuilder.DefineDynamicModule("MyModule2", _
                                  False)

注解

定义程序集中同名的多个动态模块是错误的。

即使使用 RunAndSave创建父动态程序集,也不会保存动态模块。

注意

若要在调试动态模块时取消优化,在调用 DefineDynamicModule之前,将 DebuggableAttribute 属性应用于动态程序集。 使用 DisableOptimizations 标志创建 DebuggableAttribute 实例,并使用 SetCustomAttribute 方法应用它。 该属性必须应用于动态程序集。 如果应用于模块,则不起作用。

注意

从 .NET Framework 2.0 Service Pack 1 开始,此成员不再需要具有 ReflectionPermissionFlag.ReflectionEmit 标志 ReflectionPermission。 (请参阅反射发出中的 安全问题。若要使用此功能,应用程序应面向 .NET Framework 3.5 或更高版本。

适用于

DefineDynamicModule(String, String)

使用将保存到指定文件的名称定义持久动态模块。 未发出符号信息。

public:
 System::Reflection::Emit::ModuleBuilder ^ DefineDynamicModule(System::String ^ name, System::String ^ fileName);
public System.Reflection.Emit.ModuleBuilder DefineDynamicModule (string name, string fileName);
member this.DefineDynamicModule : string * string -> System.Reflection.Emit.ModuleBuilder
Public Function DefineDynamicModule (name As String, fileName As String) As ModuleBuilder

参数

name
String

动态模块的名称。

fileName
String

应将动态模块保存到的文件的名称。

返回

表示定义的动态模块的 ModuleBuilder 对象。

例外

namefileNamenull

namefileName 的长度为零。

-或-

name 的长度大于系统定义的最大长度。

-或-

fileName 包含路径规范(例如目录组件)。

-或-

与属于此程序集的另一个文件的名称存在冲突。

此程序集以前已保存。

此程序集在具有 Run 属性的动态程序集上调用。

调用方没有所需的权限。

无法加载默认符号编写器的程序集。

-或-

找不到实现默认符号编写器接口的类型。

示例

下面的代码示例演示如何使用 DefineDynamicModule创建持久动态模块。

AppDomain^ myAppDomain = Thread::GetDomain();
AssemblyName^ myAsmName = gcnew AssemblyName;
myAsmName->Name = "MyAssembly";
AssemblyBuilder^ myAsmBuilder = myAppDomain->DefineDynamicAssembly(
   myAsmName, AssemblyBuilderAccess::Run );

// Create a dynamic module that can be saved as the specified DLL name.
ModuleBuilder^ myModuleBuilder = myAsmBuilder->DefineDynamicModule(
   "MyModule3", "MyModule3.dll" );
AppDomain myAppDomain = Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = "MyAssembly";
AssemblyBuilder myAsmBuilder = myAppDomain.DefineDynamicAssembly(
                     myAsmName,
                     AssemblyBuilderAccess.Run);
// Create a dynamic module that can be saved as the specified DLL name.
ModuleBuilder myModuleBuilder = myAsmBuilder.DefineDynamicModule("MyModule3",
                                 "MyModule3.dll");
Dim myAppDomain As AppDomain = Thread.GetDomain()
Dim myAsmName As New AssemblyName()
myAsmName.Name = "MyAssembly"
Dim myAsmBuilder As AssemblyBuilder = myAppDomain.DefineDynamicAssembly(myAsmName, _
                      AssemblyBuilderAccess.Run)
' Create a dynamic module that can be saved as the specified DLL name.
Dim myModuleBuilder As ModuleBuilder = myAsmBuilder.DefineDynamicModule("MyModule3", _
                              "MyModule3.dll")

注解

若要定义持久动态模块,需要使用 SaveRunAndSave 属性创建此程序集。

如果希望模块包含程序集清单,name 应与程序集的名称相同(也就是说,用于创建动态程序集的 AssemblyNameAssemblyName.Name 属性),fileName 应与保存程序集时指定的文件名相同。

在只有一个模块的程序集中,该模块应包含程序集清单。

注意

若要在调试动态模块时取消优化,在调用 DefineDynamicModule之前,将 DebuggableAttribute 属性应用于动态程序集。 使用 DisableOptimizations 标志创建 DebuggableAttribute 实例,并使用 SetCustomAttribute 方法应用它。 该属性必须应用于动态程序集。 如果应用于模块,则不起作用。

注意

从 .NET Framework 2.0 Service Pack 1 开始,此成员不再需要具有 ReflectionPermissionFlag.ReflectionEmit 标志 ReflectionPermission。 (请参阅反射发出中的 安全问题。若要使用此功能,应用程序应面向 .NET Framework 3.5 或更高版本。

适用于

DefineDynamicModule(String, String, Boolean)

定义一个持久动态模块,指定模块名称、将保存模块的文件的名称,以及是否应使用默认符号编写器发出符号信息。

public:
 System::Reflection::Emit::ModuleBuilder ^ DefineDynamicModule(System::String ^ name, System::String ^ fileName, bool emitSymbolInfo);
public System.Reflection.Emit.ModuleBuilder DefineDynamicModule (string name, string fileName, bool emitSymbolInfo);
member this.DefineDynamicModule : string * string * bool -> System.Reflection.Emit.ModuleBuilder
Public Function DefineDynamicModule (name As String, fileName As String, emitSymbolInfo As Boolean) As ModuleBuilder

参数

name
String

动态模块的名称。

fileName
String

应将动态模块保存到的文件的名称。

emitSymbolInfo
Boolean

如果 true,则使用默认符号编写器编写符号信息。

返回

表示定义的动态模块的 ModuleBuilder 对象。

例外

namefileNamenull

namefileName 的长度为零。

-或-

name 的长度大于系统定义的最大长度。

-或-

fileName 包含路径规范(例如目录组件)。

-或-

与属于此程序集的另一个文件的名称存在冲突。

此程序集以前已保存。

此程序集在具有 Run 属性的动态程序集上调用。

无法加载默认符号编写器的程序集。

-或-

找不到实现默认符号编写器接口的类型。

调用方没有所需的权限。

示例

下面的代码示例演示如何使用 DefineDynamicModule创建具有符号排放的持久动态模块。

AppDomain^ myAppDomain = Thread::GetDomain();
AssemblyName^ myAsmName = gcnew AssemblyName;
myAsmName->Name = "MyAssembly";
AssemblyBuilder^ myAsmBuilder = myAppDomain->DefineDynamicAssembly(
   myAsmName, AssemblyBuilderAccess::Run );

// Create a dynamic module that can be saved as the specified DLL name. By
// specifying the third parameter as true, we can allow the emission of symbol info.
ModuleBuilder^ myModuleBuilder = myAsmBuilder->DefineDynamicModule(
   "MyModule4", "MyModule4.dll", true );
AppDomain myAppDomain = Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = "MyAssembly";
AssemblyBuilder myAsmBuilder = myAppDomain.DefineDynamicAssembly(
                     myAsmName,
                     AssemblyBuilderAccess.Run);
// Create a dynamic module that can be saved as the specified DLL name. By
// specifying the third parameter as true, we can allow the emission of symbol info.
ModuleBuilder myModuleBuilder = myAsmBuilder.DefineDynamicModule("MyModule4",
                                 "MyModule4.dll",
                                  true);
Dim myAppDomain As AppDomain = Thread.GetDomain()
Dim myAsmName As New AssemblyName()
myAsmName.Name = "MyAssembly"
Dim myAsmBuilder As AssemblyBuilder = myAppDomain.DefineDynamicAssembly(myAsmName, _
                      AssemblyBuilderAccess.Run)
' Create a dynamic module that can be saved as the specified DLL name. By
' specifying the third parameter as true, we can allow the emission of symbol info.
Dim myModuleBuilder As ModuleBuilder = myAsmBuilder.DefineDynamicModule("MyModule4", _
                              "MyModule4.dll", _
                              True)

注解

若要定义持久动态模块,需要使用 SaveRunAndSave 属性创建此程序集。

如果希望模块包含程序集清单,name 应与程序集的名称相同(也就是说,用于创建动态程序集的 AssemblyNameAssemblyName.Name 属性),fileName 应与保存程序集时指定的文件名相同。

在只有一个模块的程序集中,该模块应包含程序集清单。

注意

若要在调试动态模块时取消优化,在调用 DefineDynamicModule之前,将 DebuggableAttribute 属性应用于动态程序集。 使用 DisableOptimizations 标志创建 DebuggableAttribute 实例,并使用 SetCustomAttribute 方法应用它。 该属性必须应用于动态程序集。 如果应用于模块,则不起作用。

注意

从 .NET Framework 2.0 Service Pack 1 开始,此成员不再需要具有 ReflectionPermissionFlag.ReflectionEmit 标志 ReflectionPermission。 (请参阅反射发出中的 安全问题。若要使用此功能,应用程序应面向 .NET Framework 3.5 或更高版本。

适用于