次の方法で共有


_AppDomain.DefineDynamicAssembly メソッド (AssemblyName, AssemblyBuilderAccess, Evidence, PermissionSet, PermissionSet, PermissionSet)

名前、アクセス モード、証拠、およびアクセス許可要求を指定して、動的アセンブリを定義します。

Function DefineDynamicAssembly( _
   ByVal name As AssemblyName, _   ByVal access As AssemblyBuilderAccess, _   ByVal evidence As Evidence, _   ByVal requiredPermissions As PermissionSet, _   ByVal optionalPermissions As PermissionSet, _   ByVal refusedPermissions As PermissionSet _) As AssemblyBuilder
[C#]
AssemblyBuilder DefineDynamicAssembly(
   AssemblyNamename,AssemblyBuilderAccessaccess,Evidenceevidence,PermissionSetrequiredPermissions,PermissionSetoptionalPermissions,PermissionSetrefusedPermissions);
[C++]
AssemblyBuilder* DefineDynamicAssembly(
   AssemblyName* name,AssemblyBuilderAccessaccess,Evidence* evidence,PermissionSet* requiredPermissions,PermissionSet* optionalPermissions,PermissionSet* refusedPermissions);
[JScript]
function DefineDynamicAssembly(
   name : AssemblyName,access : AssemblyBuilderAccess,evidence : Evidence,requiredPermissions : PermissionSet,optionalPermissions : PermissionSet,refusedPermissions : PermissionSet) : AssemblyBuilder;

パラメータ

  • name
    動的アセンブリの一意の ID。
  • access
    動的アセンブリにアクセスするときのモード。
  • evidence
    動的アセンブリに指定する証拠。
  • requiredPermissions
    必須のアクセス許可要求。
  • optionalPermissions
    オプションのアクセス許可要求。
  • refusedPermissions
    拒否されたアクセス許可要求。

戻り値

作成された動的アセンブリを表します。

例外

例外の種類 条件
ArgumentNullException name が null 参照 (Visual Basic では Nothing) です。
ArgumentException nameName プロパティが null 参照 (Visual Basic では Nothing) です。

または

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

解説

完全に信頼されている呼び出し元だけが、動的な Assembly を定義するときに evidence を指定できます。ランタイムは、指定された Evidence をセキュリティ ポリシーを通じて割り当て、アセンブリに与えられるアクセス許可を確認します。信頼性が一部しか確認されていない呼び出し元は、 evidence として null を指定する必要があります。 evidence が null 参照 (Visual Basic では Nothing) の場合、ランタイムはアクセス許可セット (与えられるアクセス許可と拒否されるアクセス許可の現在のセット) を、呼び出し元の Assembly から、定義中の動的な Assembly にコピーし、ポリシーを解決済みとしてマークします。

動的な Assembly をディスクに保存する場合は、後からそのアセンブリを読み込むときには、その Assembly が保存された場所に関連付けられたポリシーに基づいて、アセンブリに与えられるアクセス許可が取得されます。

このメソッドは、現在のアプリケーション ドメインで動的アセンブリを定義するためだけに使用してください。詳細については、「 AppDomain.Load メソッド (AssemblyName) 」の解説を参照してください。

name パラメータは、 VersionOperatingSystem コンストラクタのパラメータとして間接的に指定します。ただし、このメソッドでは、ビルド番号とリビジョン番号ではなく、メジャー バージョン番号とマイナ バージョン番号だけが永続化されます。たとえば、 LoadFrom メソッドを使用して、アセンブリに対して指定されたこの Version オブジェクトを間接的に回復した場合、そのオブジェクトのメジャー バージョン番号とマイナ バージョン番号だけが最初に指定されたままの値になります。

使用例

[Visual Basic, C#, C++] DefineDynamicAssembly メソッドおよび AssemblyResolve イベントを次のサンプルで示します。

 

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 ファミリ

参照

_AppDomain インターフェイス | _AppDomain メンバ | System 名前空間 | _AppDomain.DefineDynamicAssembly オーバーロードの一覧