次の方法で共有


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 nameName プロパティが null 参照 (Visual Basic では Nothing) です。

または

nameName プロパティが空白で始まっているか、スラッシュまたは円記号が含まれています。

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 セキュリティ:

参照

AppDomain クラス | AppDomain メンバ | System 名前空間 | AppDomain.DefineDynamicAssembly オーバーロードの一覧