AppDomain.DefineDynamicAssembly メソッド (AssemblyName, AssemblyBuilderAccess, String, Evidence, PermissionSet, PermissionSet, PermissionSet, Boolean)
名前、アクセス モード、ストレージ ディレクトリ、証拠、アクセス許可要求、および同期オプションを指定して、動的アセンブリを定義します。
Overloads Public Overridable Function DefineDynamicAssembly( _
ByVal name As AssemblyName, _ ByVal access As AssemblyBuilderAccess, _ ByVal dir As String, _ ByVal evidence As Evidence, _ ByVal requiredPermissions As PermissionSet, _ ByVal optionalPermissions As PermissionSet, _ ByVal refusedPermissions As PermissionSet, _ ByVal isSynchronized As Boolean _) As AssemblyBuilder Implements _AppDomain.DefineDynamicAssembly
[C#]
public virtual AssemblyBuilder DefineDynamicAssembly(AssemblyNamename,AssemblyBuilderAccessaccess,stringdir,Evidenceevidence,PermissionSetrequiredPermissions,PermissionSetoptionalPermissions,PermissionSetrefusedPermissions,boolisSynchronized);
[C++]
public: virtual AssemblyBuilder* DefineDynamicAssembly(AssemblyName* name,AssemblyBuilderAccessaccess,String* dir,Evidence* evidence,PermissionSet* requiredPermissions,PermissionSet* optionalPermissions,PermissionSet* refusedPermissions,boolisSynchronized);
[JScript]
public function DefineDynamicAssembly(
name : AssemblyName,access : AssemblyBuilderAccess,dir : String,evidence : Evidence,requiredPermissions : PermissionSet,optionalPermissions : PermissionSet,refusedPermissions : PermissionSet,isSynchronized : Boolean) : AssemblyBuilder;
パラメータ
- name
動的アセンブリの一意の ID。 - access
動的アセンブリにアクセスするときのモード。 - dir
動的アセンブリを保存するディレクトリの名前。 dir が null 参照 (Visual Basic では Nothing) の場合は、現在のディレクトリが既定で使用されます。 - evidence
動的アセンブリに指定する証拠。証拠は、ポリシーの解決に使用する証拠の最終セットを変更されないために使用されます。 - requiredPermissions
必須のアクセス許可要求。 - optionalPermissions
オプションのアクセス許可要求。 - refusedPermissions
拒否されたアクセス許可要求。 - isSynchronized
動的アセンブリ内のモジュール、型、およびメンバの作成を同期する場合は true 。それ以外の場合は false 。
戻り値
作成された動的アセンブリを表します。
実装
_AppDomain.DefineDynamicAssembly
例外
例外の種類 | 条件 |
---|---|
ArgumentNullException | name が null 参照 (Visual Basic では Nothing) です。 |
ArgumentException | name の Name プロパティが null 参照 (Visual Basic では Nothing) です。
または name の Name プロパティが空白で始まっているか、スラッシュまたは円記号が含まれています。 |
AppDomainUnloadedException | 操作が、アンロードされたアプリケーション ドメインで試行されています。 |
SecurityException | 呼び出し元に、必要なアクセス許可がありません。 |
解説
完全に信頼された呼び出し元だけが、動的な Assembly を定義するときに証拠を指定できます。ランタイムは、指定された Evidence をセキュリティ ポリシーを通じて割り当て、アセンブリに与えられるアクセス許可を確認します。信頼性が一部しか確認されていない呼び出し元は、 evidence パラメータに null 参照 (Visual Basic では Nothing) を指定する必要があります。 evidence が null 参照 (Nothing) の場合、ランタイムはアクセス許可セット (与えられるアクセス許可と拒否されるアクセス許可の現在のセット) を、呼び出し元の Assembly から、定義中の動的な Assembly にコピーし、ポリシーを解決済みとしてマークします。
動的な Assembly をディスクに保存する場合は、後からそのアセンブリを読み込むときには、その Assembly が保存された場所に関連付けられたポリシーに基づいて、アセンブリに与えられるアクセス許可が取得されます。
name パラメータは、 Version オブジェクトを OperatingSystem コンストラクタのパラメータとして間接的に指定します。ただし、このメソッドでは、ビルド番号とリビジョン番号ではなく、メジャー バージョン番号とマイナ バージョン番号だけが永続化されます。つまり、たとえば、 LoadFrom メソッドを使用して、アセンブリに対して指定されたこの Version オブジェクトを間接的に回復した場合、そのオブジェクトのメジャー バージョン番号とマイナ バージョン番号だけが最初に指定されたままの値になります。
使用例
[Visual Basic, C#, C++] DefineDynamicAssembly メソッドおよび AssemblyResolve イベントを次のサンプルで示します。
[Visual Basic, C#, C++] このコード例を実行するには、アセンブリの完全限定名を指定する必要があります。アセンブリの完全限定名を取得する方法については、「 アセンブリ名 」を参照してください。
Imports System
Imports System.Reflection
Imports System.Reflection.Emit
Module Test
Sub Main()
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
InstantiateMyDynamicType(currentDomain) 'Failed!
AddHandler currentDomain.AssemblyResolve, AddressOf MyResolveEventHandler
InstantiateMyDynamicType(currentDomain) 'OK!
End Sub 'Main
Sub InstantiateMyDynamicType(domain As AppDomain)
Try
' You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType")
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub 'InstantiateMyDynamicType
Function MyResolveEventHandler(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
Return DefineDynamicAssembly(DirectCast(sender, AppDomain))
End Function 'MyResolveEventHandler
Function DefineDynamicAssembly(domain As AppDomain) As System.Reflection.Assembly
' Build a dynamic assembly using Reflection Emit API.
Dim assemblyName As New AssemblyName()
assemblyName.Name = "MyDynamicAssembly"
Dim assemblyBuilder As AssemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run)
Dim moduleBuilder As ModuleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule")
Dim typeBuilder As TypeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public)
Dim constructorBuilder As ConstructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Nothing)
Dim ilGenerator As ILGenerator = constructorBuilder.GetILGenerator()
ilGenerator.EmitWriteLine("MyDynamicType instantiated!")
ilGenerator.Emit(OpCodes.Ret)
typeBuilder.CreateType()
Return assemblyBuilder
End Function 'DefineDynamicAssembly
End Module 'Test
[C#]
using System;
using System.Reflection;
using System.Reflection.Emit;
class Test {
public static void Main() {
AppDomain currentDomain = AppDomain.CurrentDomain;
InstantiateMyDynamicType(currentDomain); // Failed!
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
InstantiateMyDynamicType(currentDomain); // OK!
}
static void InstantiateMyDynamicType(AppDomain domain) {
try {
// You must supply a valid fully qualified assembly name here.
domain.CreateInstance("Assembly text name, Version, Culture, PublicKeyToken", "MyDynamicType");
} catch (Exception e) {
Console.WriteLine(e.Message);
}
}
static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) {
return DefineDynamicAssembly((AppDomain) sender);
}
static Assembly DefineDynamicAssembly(AppDomain domain) {
// Build a dynamic assembly using Reflection Emit API.
AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "MyDynamicAssembly";
AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyDynamicModule");
TypeBuilder typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Public);
ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);
ILGenerator ilGenerator = constructorBuilder.GetILGenerator();
ilGenerator.EmitWriteLine("MyDynamicType instantiated!");
ilGenerator.Emit(OpCodes.Ret);
typeBuilder.CreateType();
return assemblyBuilder;
}
}
[C++]
#using <mscorlib.dll>
using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
__gc class Test {
public:
static void InstantiateMyDynamicType(AppDomain* domain) {
try {
// You must supply a valid fully qualified assembly name here.
domain->CreateInstance(S"Assembly text name, Version, Culture, PublicKeyToken", S"MyDynamicType");
} catch (Exception* e) {
Console::WriteLine(e->Message);
}
}
static Assembly* MyResolveEventHandler(Object* sender, ResolveEventArgs* args) {
return DefineDynamicAssembly(dynamic_cast<AppDomain*> (sender));
}
static Assembly* DefineDynamicAssembly(AppDomain* domain) {
// Build a dynamic assembly using Reflection Emit API.
AssemblyName* assemblyName = new AssemblyName();
assemblyName->Name = S"MyDynamicAssembly";
AssemblyBuilder* assemblyBuilder = domain->DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess::Run);
ModuleBuilder* moduleBuilder = assemblyBuilder->DefineDynamicModule(S"MyDynamicModule");
TypeBuilder* typeBuilder = moduleBuilder->DefineType(S"MyDynamicType", TypeAttributes::Public);
ConstructorBuilder* constructorBuilder = typeBuilder->DefineConstructor(MethodAttributes::Public, CallingConventions::Standard, 0);
ILGenerator* ilGenerator = constructorBuilder->GetILGenerator();
ilGenerator->EmitWriteLine(S"MyDynamicType instantiated!");
ilGenerator->Emit(OpCodes::Ret);
typeBuilder->CreateType();
return assemblyBuilder;
}
};
int main() {
AppDomain* currentDomain = AppDomain::CurrentDomain;
Test::InstantiateMyDynamicType(currentDomain); // Failed!
currentDomain->AssemblyResolve += new ResolveEventHandler(0, Test::MyResolveEventHandler);
Test::InstantiateMyDynamicType(currentDomain); // OK!
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
.NET Framework セキュリティ:
- ReflectionPermission (Type.InvokeMember などの機構を通じて遅延バインディングが呼び出されるときに必要なアクセス許可) ReflectionPermissionFlag.MemberAccess (関連する列挙体)
- FileIOPermission (ファイルまたはディレクトリから読み取るためのアクセス許可、またはパス自体の情報に対するアクセス許可) FileIOPermissionAccess.Read 、 FileIOPermissionAccess.PathDiscovery (関連する列挙体)
- SecurityPermission (証拠が指定されたアセンブリを読み込むために必要なアクセス許可) SecurityPermissionFlag.ControlEvidence (関連する列挙体)
参照
AppDomain クラス | AppDomain メンバ | System 名前空間 | AppDomain.DefineDynamicAssembly オーバーロードの一覧