AppDomain.CreateInstanceAndUnwrap メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
指定した型の新しいインスタンスを作成します。
オーバーロード
CreateInstanceAndUnwrap(String, String) |
指定した型の新しいインスタンスを作成します。 型が定義されているアセンブリの名前と、型の名前をパラメーターで指定します。 |
CreateInstanceAndUnwrap(String, String, Object[]) |
指定した型の新しいインスタンスを作成します。 型が定義されているアセンブリの名前、型の名前、およびアクティベーション属性の配列をパラメーターで指定します。 |
CreateInstanceAndUnwrap(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[]) |
指定したアセンブリで定義されている、指定した型の新しいインスタンスを作成します。型名の大文字と小文字の区別を無視するかどうか、作成する型を選択するために使用されるバインディング属性とバインダー、コンストラクターの引数、カルチャ、およびアクティベーション属性を指定します。 |
CreateInstanceAndUnwrap(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[], Evidence) |
古い.
指定した型の新しいインスタンスを作成します。 型の名前、およびその検索方法と作成方法をパラメーターで指定します。 |
CreateInstanceAndUnwrap(String, String)
- ソース:
- AppDomain.cs
- ソース:
- AppDomain.cs
- ソース:
- AppDomain.cs
指定した型の新しいインスタンスを作成します。 型が定義されているアセンブリの名前と、型の名前をパラメーターで指定します。
public:
System::Object ^ CreateInstanceAndUnwrap(System::String ^ assemblyName, System::String ^ typeName);
public object? CreateInstanceAndUnwrap (string assemblyName, string typeName);
public object CreateInstanceAndUnwrap (string assemblyName, string typeName);
member this.CreateInstanceAndUnwrap : string * string -> obj
Public Function CreateInstanceAndUnwrap (assemblyName As String, typeName As String) As Object
パラメーター
戻り値
typeName
で指定したオブジェクトのインスタンス。
例外
assemblyName
または typeName
が null
です。
一致するパブリック コンストラクターが見つかりませんでした。
typename
が assemblyName
で見つかりませんでした。
assemblyName
が見つかりませんでした。
呼び出し元には、このコンストラクターを呼び出すアクセス許可がありません。
アンロードされたアプリケーション ドメインで操作しようとします。
assemblyName
は、現在読み込まれているランタイムの有効なアセンブリではありません。
アセンブリまたはモジュールが、2 つの異なる証拠を使用して 2 回読み込まれました。
例
次のコード例は、別のアプリケーション ドメインでコードを実行する最も簡単な方法を示しています。 この例では、 からMarshalByRefObject継承する という名前Worker
のクラスを定義します。 クラスは Worker
、それが実行されているアプリケーション ドメインの名前を表示するメソッドを定義します。 この例では、既定の Worker
アプリケーション ドメインと新しいアプリケーション ドメインに のインスタンスを作成します。
注意
を含むアセンブリは両方の Worker
アプリケーション ドメインに読み込む必要がありますが、新しいアプリケーション ドメインにのみ存在する他のアセンブリを読み込むことができます。
using namespace System;
using namespace System::Reflection;
public ref class Worker : MarshalByRefObject
{
public:
void PrintDomain()
{
Console::WriteLine("Object is executing in AppDomain \"{0}\"",
AppDomain::CurrentDomain->FriendlyName);
}
};
void main()
{
// Create an ordinary instance in the current AppDomain
Worker^ localWorker = gcnew Worker();
localWorker->PrintDomain();
// Create a new application domain, create an instance
// of Worker in the application domain, and execute code
// there.
AppDomain^ ad = AppDomain::CreateDomain("New domain");
Worker^ remoteWorker = (Worker^) ad->CreateInstanceAndUnwrap(
Worker::typeid->Assembly->FullName,
"Worker");
remoteWorker->PrintDomain();
}
/* This code produces output similar to the following:
Object is executing in AppDomain "source.exe"
Object is executing in AppDomain "New domain"
*/
using System;
using System.Reflection;
public class CreateInstanceWorker : MarshalByRefObject
{
public void PrintDomain()
{
Console.WriteLine("Object is executing in AppDomain \"{0}\"",
AppDomain.CurrentDomain.FriendlyName);
}
}
class CreateInstanceAndUnwrapSourceSnippet
{
public static void Main()
{
// Create an ordinary instance in the current AppDomain
CreateInstanceWorker localWorker = new CreateInstanceWorker();
localWorker.PrintDomain();
// Create a new application domain, create an instance
// of Worker in the application domain, and execute code
// there.
AppDomain ad = AppDomain.CreateDomain("New domain");
CreateInstanceWorker remoteWorker = (CreateInstanceWorker) ad.CreateInstanceAndUnwrap(
typeof(CreateInstanceWorker).Assembly.FullName,
"Worker");
remoteWorker.PrintDomain();
}
}
/* This code produces output similar to the following:
Object is executing in AppDomain "source.exe"
Object is executing in AppDomain "New domain"
*/
open System
open System.Reflection
type Worker() =
inherit MarshalByRefObject()
member _.PrintDomain() =
printfn $"Object is executing in AppDomain \"{AppDomain.CurrentDomain.FriendlyName}\""
// Create an ordinary instance in the current AppDomain
let localWorker = Worker()
localWorker.PrintDomain()
// Create a new application domain, create an instance
// of Worker in the application domain, and execute code
// there.
let ad = AppDomain.CreateDomain "New domain"
let remoteWorker =
ad.CreateInstanceAndUnwrap(typeof<Worker>.Assembly.FullName, "Worker") :?> Worker
remoteWorker.PrintDomain()
// This code produces output similar to the following:
// Object is executing in AppDomain "source.exe"
// Object is executing in AppDomain "New domain"
Imports System.Reflection
Public Class Worker
Inherits MarshalByRefObject
Public Sub PrintDomain()
Console.WriteLine("Object is executing in AppDomain ""{0}""", _
AppDomain.CurrentDomain.FriendlyName)
End Sub
End Class
Class Example
Public Shared Sub Main()
' Create an ordinary instance in the current AppDomain
Dim localWorker As New Worker()
localWorker.PrintDomain()
' Create a new application domain, create an instance
' of Worker in the application domain, and execute code
' there.
Dim ad As AppDomain = AppDomain.CreateDomain("New domain")
Dim remoteWorker As Worker = CType( _
ad.CreateInstanceAndUnwrap( _
GetType(Worker).Assembly.FullName, _
"Worker"), _
Worker)
remoteWorker.PrintDomain()
End Sub
End Class
' This code produces output similar to the following:
'
'Object is executing in AppDomain "source.exe"
'Object is executing in AppDomain "New domain"
注釈
これは、 と ObjectHandle.Unwrapを組み合わせた便利なCreateInstanceメソッドです。 このメソッドは、 のパラメーターなしのコンストラクターを typeName
呼び出します。
の形式assemblyName
については、 を参照してくださいAssemblyName。 の形式typeName
については、 Type.FullName プロパティを参照してください。
注意
によってCreateInstanceAndUnwrap返された型T1
のオブジェクトのメソッドM
に対して事前バインドされた呼び出しを行い、そのメソッドが、現在のアセンブリまたは を含むアセンブリ以外のアセンブリC
内の型T2
のオブジェクトのメソッドに対して事前バインドされた呼び出しをT1
行うと、アセンブリC
が現在のアプリケーション ドメインに読み込まれます。 この読み込みは、 への T1.M()
事前バインディング呼び出しが の本体で行われた場合や、他の DynamicMethod動的に生成されたコードで行われた場合でも発生します。 現在のドメインが既定のドメインの場合、プロセスが終了するまでアセンブリ C
をアンロードすることはできません。 現在のドメインが後でアセンブリ C
を読み込もうとすると、読み込みが失敗する可能性があります。
こちらもご覧ください
適用対象
CreateInstanceAndUnwrap(String, String, Object[])
- ソース:
- AppDomain.cs
- ソース:
- AppDomain.cs
- ソース:
- AppDomain.cs
指定した型の新しいインスタンスを作成します。 型が定義されているアセンブリの名前、型の名前、およびアクティベーション属性の配列をパラメーターで指定します。
public:
System::Object ^ CreateInstanceAndUnwrap(System::String ^ assemblyName, System::String ^ typeName, cli::array <System::Object ^> ^ activationAttributes);
public object? CreateInstanceAndUnwrap (string assemblyName, string typeName, object?[]? activationAttributes);
public object CreateInstanceAndUnwrap (string assemblyName, string typeName, object[] activationAttributes);
member this.CreateInstanceAndUnwrap : string * string * obj[] -> obj
Public Function CreateInstanceAndUnwrap (assemblyName As String, typeName As String, activationAttributes As Object()) As Object
パラメーター
- activationAttributes
- Object[]
アクティべーションに参加できる 1 つ以上の属性の配列。 通常、リモート オブジェクトをアクティブ化するために必要な URL を指定する 1 つの UrlAttribute オブジェクトを含む配列。
このパラメーターは、クライアント側でアクティブ化されるオブジェクトに関連しています。クライアント アクティベーションは、下位互換性のために残されているレガシ テクノロジです。新規の開発には使用しないでください。 分散アプリケーションは、代わりに Windows Communication Foundation (WCF) を使用する必要があります。
戻り値
typeName
で指定したオブジェクトのインスタンス。
例外
assemblyName
または typeName
が null
です。
一致するパブリック コンストラクターが見つかりませんでした。
typename
が assemblyName
で見つかりませんでした。
assemblyName
が見つかりませんでした。
呼び出し元には、このコンストラクターを呼び出すアクセス許可がありません。
呼び出し元は、MarshalByRefObject を継承しないオブジェクトのアクティベーション属性を提供できません。
アンロードされたアプリケーション ドメインで操作しようとします。
assemblyName
は、現在読み込まれているランタイムの有効なアセンブリではありません。
アセンブリまたはモジュールが、2 つの異なる証拠を使用して 2 回読み込まれました。
例
using namespace System;
using namespace System::IO;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::Remoting;
ref class ADDyno
{
public:
static Type^ CreateADynamicAssembly( interior_ptr<AppDomain^> myNewDomain, String^ executableNameNoExe )
{
String^ executableName = String::Concat( executableNameNoExe, ".exe" );
AssemblyName^ myAsmName = gcnew AssemblyName;
myAsmName->Name = executableNameNoExe;
myAsmName->CodeBase = Environment::CurrentDirectory;
AssemblyBuilder^ myAsmBuilder = ( *myNewDomain)->DefineDynamicAssembly( myAsmName, AssemblyBuilderAccess::RunAndSave );
Console::WriteLine( "-- Dynamic Assembly instantiated." );
ModuleBuilder^ myModBuilder = myAsmBuilder->DefineDynamicModule( executableNameNoExe, executableName );
TypeBuilder^ myTypeBuilder = myModBuilder->DefineType( executableNameNoExe, TypeAttributes::Public, MarshalByRefObject::typeid );
array<Type^>^temp0 = nullptr;
MethodBuilder^ myFCMethod = myTypeBuilder->DefineMethod( "CountLocalFiles", static_cast<MethodAttributes>(MethodAttributes::Public | MethodAttributes::Static), nullptr, temp0 );
MethodInfo^ currentDirGetMI = Environment::typeid->GetProperty( "CurrentDirectory" )->GetGetMethod();
array<Type^>^temp1 = {String::typeid};
MethodInfo^ writeLine0objMI = Console::typeid->GetMethod( "WriteLine", temp1 );
array<Type^>^temp2 = {String::typeid,Object::typeid,Object::typeid};
MethodInfo^ writeLine2objMI = Console::typeid->GetMethod( "WriteLine", temp2 );
array<Type^>^temp3 = {String::typeid};
MethodInfo^ getFilesMI = Directory::typeid->GetMethod( "GetFiles", temp3 );
myFCMethod->InitLocals = true;
ILGenerator^ myFCIL = myFCMethod->GetILGenerator();
Console::WriteLine( "-- Generating MSIL method body..." );
LocalBuilder^ v0 = myFCIL->DeclareLocal( String::typeid );
LocalBuilder^ v1 = myFCIL->DeclareLocal( int::typeid );
LocalBuilder^ v2 = myFCIL->DeclareLocal( String::typeid );
LocalBuilder^ v3 = myFCIL->DeclareLocal( array<String^>::typeid );
Label evalForEachLabel = myFCIL->DefineLabel();
Label topOfForEachLabel = myFCIL->DefineLabel();
// Build the method body.
myFCIL->EmitCall( OpCodes::Call, currentDirGetMI, nullptr );
myFCIL->Emit( OpCodes::Stloc_S, v0 );
myFCIL->Emit( OpCodes::Ldc_I4_0 );
myFCIL->Emit( OpCodes::Stloc_S, v1 );
myFCIL->Emit( OpCodes::Ldstr, "---" );
myFCIL->EmitCall( OpCodes::Call, writeLine0objMI, nullptr );
myFCIL->Emit( OpCodes::Ldloc_S, v0 );
myFCIL->EmitCall( OpCodes::Call, getFilesMI, nullptr );
myFCIL->Emit( OpCodes::Stloc_S, v3 );
myFCIL->Emit( OpCodes::Br_S, evalForEachLabel );
// foreach loop starts here.
myFCIL->MarkLabel( topOfForEachLabel );
// Load array of strings and index, store value at index for output.
myFCIL->Emit( OpCodes::Ldloc_S, v3 );
myFCIL->Emit( OpCodes::Ldloc_S, v1 );
myFCIL->Emit( OpCodes::Ldelem_Ref );
myFCIL->Emit( OpCodes::Stloc_S, v2 );
myFCIL->Emit( OpCodes::Ldloc_S, v2 );
myFCIL->EmitCall( OpCodes::Call, writeLine0objMI, nullptr );
// Increment counter by one.
myFCIL->Emit( OpCodes::Ldloc_S, v1 );
myFCIL->Emit( OpCodes::Ldc_I4_1 );
myFCIL->Emit( OpCodes::Add );
myFCIL->Emit( OpCodes::Stloc_S, v1 );
// Determine if end of file list array has been reached.
myFCIL->MarkLabel( evalForEachLabel );
myFCIL->Emit( OpCodes::Ldloc_S, v1 );
myFCIL->Emit( OpCodes::Ldloc_S, v3 );
myFCIL->Emit( OpCodes::Ldlen );
myFCIL->Emit( OpCodes::Conv_I4 );
myFCIL->Emit( OpCodes::Blt_S, topOfForEachLabel );
//foreach loop end here.
myFCIL->Emit( OpCodes::Ldstr, "---" );
myFCIL->EmitCall( OpCodes::Call, writeLine0objMI, nullptr );
myFCIL->Emit( OpCodes::Ldstr, "There are {0} files in {1}." );
myFCIL->Emit( OpCodes::Ldloc_S, v1 );
myFCIL->Emit( OpCodes::Box, int::typeid );
myFCIL->Emit( OpCodes::Ldloc_S, v0 );
myFCIL->EmitCall( OpCodes::Call, writeLine2objMI, nullptr );
myFCIL->Emit( OpCodes::Ret );
Type^ myType = myTypeBuilder->CreateType();
myAsmBuilder->SetEntryPoint( myFCMethod );
myAsmBuilder->Save( executableName );
Console::WriteLine( "-- Method generated, type completed, and assembly saved to disk." );
return myType;
}
};
int main()
{
String^ domainDir;
String^ executableName = nullptr;
Console::Write( "Enter a name for the file counting assembly: " );
String^ executableNameNoExe = Console::ReadLine();
executableName = String::Concat( executableNameNoExe, ".exe" );
Console::WriteLine( "---" );
domainDir = Environment::CurrentDirectory;
AppDomain^ curDomain = Thread::GetDomain();
// Create a new AppDomain, with the current directory as the base.
Console::WriteLine( "Current Directory: {0}", Environment::CurrentDirectory );
AppDomainSetup^ mySetupInfo = gcnew AppDomainSetup;
mySetupInfo->ApplicationBase = domainDir;
mySetupInfo->ApplicationName = executableNameNoExe;
mySetupInfo->LoaderOptimization = LoaderOptimization::SingleDomain;
AppDomain^ myDomain = AppDomain::CreateDomain( executableNameNoExe, nullptr, mySetupInfo );
Console::WriteLine( "Creating a new AppDomain '{0}'...", executableNameNoExe );
Console::WriteLine( "-- Base Directory = '{0}'", myDomain->BaseDirectory );
Console::WriteLine( "-- Shadow Copy? = '{0}'", myDomain->ShadowCopyFiles );
Console::WriteLine( "---" );
Type^ myFCType = ADDyno::CreateADynamicAssembly( &curDomain, executableNameNoExe );
Console::WriteLine( "Loading '{0}' from '{1}'...", executableName, myDomain->BaseDirectory );
BindingFlags bFlags = static_cast<BindingFlags>(BindingFlags::Public | BindingFlags::CreateInstance | BindingFlags::Instance);
Object^ myObjInstance = myDomain->CreateInstanceAndUnwrap( executableNameNoExe, executableNameNoExe, false, bFlags, nullptr, nullptr, nullptr, nullptr, nullptr );
Console::WriteLine( "Executing method 'CountLocalFiles' in {0}...", myObjInstance );
array<Object^>^temp4 = nullptr;
myFCType->InvokeMember( "CountLocalFiles", BindingFlags::InvokeMethod, nullptr, myObjInstance, temp4 );
}
using System;
using System.IO;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.Remoting;
class ADDyno
{
public static Type CreateADynamicAssembly(ref AppDomain myNewDomain,
string executableNameNoExe)
{
string executableName = executableNameNoExe + ".exe";
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = executableNameNoExe;
myAsmName.CodeBase = Environment.CurrentDirectory;
AssemblyBuilder myAsmBuilder = myNewDomain.DefineDynamicAssembly(myAsmName,
AssemblyBuilderAccess.RunAndSave);
Console.WriteLine("-- Dynamic Assembly instantiated.");
ModuleBuilder myModBuilder = myAsmBuilder.DefineDynamicModule(executableNameNoExe,
executableName);
TypeBuilder myTypeBuilder = myModBuilder.DefineType(executableNameNoExe,
TypeAttributes.Public,
typeof(MarshalByRefObject));
MethodBuilder myFCMethod = myTypeBuilder.DefineMethod("CountLocalFiles",
MethodAttributes.Public |
MethodAttributes.Static,
null,
new Type[] { });
MethodInfo currentDirGetMI = typeof(Environment).GetProperty("CurrentDirectory").GetGetMethod();
MethodInfo writeLine0objMI = typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(string) });
MethodInfo writeLine2objMI = typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(string), typeof(object), typeof(object) });
MethodInfo getFilesMI = typeof(Directory).GetMethod("GetFiles",
new Type[] { typeof(string) });
myFCMethod.InitLocals = true;
ILGenerator myFCIL = myFCMethod.GetILGenerator();
Console.WriteLine("-- Generating MSIL method body...");
LocalBuilder v0 = myFCIL.DeclareLocal(typeof(string));
LocalBuilder v1 = myFCIL.DeclareLocal(typeof(int));
LocalBuilder v2 = myFCIL.DeclareLocal(typeof(string));
LocalBuilder v3 = myFCIL.DeclareLocal(typeof(string[]));
Label evalForEachLabel = myFCIL.DefineLabel();
Label topOfForEachLabel = myFCIL.DefineLabel();
// Build the method body.
myFCIL.EmitCall(OpCodes.Call, currentDirGetMI, null);
myFCIL.Emit(OpCodes.Stloc_S, v0);
myFCIL.Emit(OpCodes.Ldc_I4_0);
myFCIL.Emit(OpCodes.Stloc_S, v1);
myFCIL.Emit(OpCodes.Ldstr, "---");
myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, null);
myFCIL.Emit(OpCodes.Ldloc_S, v0);
myFCIL.EmitCall(OpCodes.Call, getFilesMI, null);
myFCIL.Emit(OpCodes.Stloc_S, v3);
myFCIL.Emit(OpCodes.Br_S, evalForEachLabel);
// foreach loop starts here.
myFCIL.MarkLabel(topOfForEachLabel);
// Load array of strings and index, store value at index for output.
myFCIL.Emit(OpCodes.Ldloc_S, v3);
myFCIL.Emit(OpCodes.Ldloc_S, v1);
myFCIL.Emit(OpCodes.Ldelem_Ref);
myFCIL.Emit(OpCodes.Stloc_S, v2);
myFCIL.Emit(OpCodes.Ldloc_S, v2);
myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, null);
// Increment counter by one.
myFCIL.Emit(OpCodes.Ldloc_S, v1);
myFCIL.Emit(OpCodes.Ldc_I4_1);
myFCIL.Emit(OpCodes.Add);
myFCIL.Emit(OpCodes.Stloc_S, v1);
// Determine if end of file list array has been reached.
myFCIL.MarkLabel(evalForEachLabel);
myFCIL.Emit(OpCodes.Ldloc_S, v1);
myFCIL.Emit(OpCodes.Ldloc_S, v3);
myFCIL.Emit(OpCodes.Ldlen);
myFCIL.Emit(OpCodes.Conv_I4);
myFCIL.Emit(OpCodes.Blt_S, topOfForEachLabel);
//foreach loop end here.
myFCIL.Emit(OpCodes.Ldstr, "---");
myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, null);
myFCIL.Emit(OpCodes.Ldstr, "There are {0} files in {1}.");
myFCIL.Emit(OpCodes.Ldloc_S, v1);
myFCIL.Emit(OpCodes.Box, typeof(int));
myFCIL.Emit(OpCodes.Ldloc_S, v0);
myFCIL.EmitCall(OpCodes.Call, writeLine2objMI, null);
myFCIL.Emit(OpCodes.Ret);
Type myType = myTypeBuilder.CreateType();
myAsmBuilder.SetEntryPoint(myFCMethod);
myAsmBuilder.Save(executableName);
Console.WriteLine("-- Method generated, type completed, and assembly saved to disk.");
return myType;
}
public static void Main()
{
string domainDir, executableName = null;
Console.Write("Enter a name for the file counting assembly: ");
string executableNameNoExe = Console.ReadLine();
executableName = executableNameNoExe + ".exe";
Console.WriteLine("---");
domainDir = Environment.CurrentDirectory;
AppDomain curDomain = Thread.GetDomain();
// Create a new AppDomain, with the current directory as the base.
Console.WriteLine("Current Directory: {0}", Environment.CurrentDirectory);
AppDomainSetup mySetupInfo = new AppDomainSetup();
mySetupInfo.ApplicationBase = domainDir;
mySetupInfo.ApplicationName = executableNameNoExe;
mySetupInfo.LoaderOptimization = LoaderOptimization.SingleDomain;
AppDomain myDomain = AppDomain.CreateDomain(executableNameNoExe,
null, mySetupInfo);
Console.WriteLine("Creating a new AppDomain '{0}'...",
executableNameNoExe);
Console.WriteLine("-- Base Directory = '{0}'", myDomain.BaseDirectory);
Console.WriteLine("-- Shadow Copy? = '{0}'", myDomain.ShadowCopyFiles);
Console.WriteLine("---");
Type myFCType = CreateADynamicAssembly(ref curDomain,
executableNameNoExe);
Console.WriteLine("Loading '{0}' from '{1}'...", executableName,
myDomain.BaseDirectory.ToString());
BindingFlags bFlags = (BindingFlags.Public | BindingFlags.CreateInstance |
BindingFlags.Instance);
Object myObjInstance = myDomain.CreateInstanceAndUnwrap(executableNameNoExe,
executableNameNoExe, false, bFlags,
null, null, null, null, null);
Console.WriteLine("Executing method 'CountLocalFiles' in {0}...",
myObjInstance.ToString());
myFCType.InvokeMember("CountLocalFiles", BindingFlags.InvokeMethod, null,
myObjInstance, new object[] { });
}
}
open System
open System.IO
open System.Threading
open System.Reflection
open System.Reflection.Emit
let createADynamicAssembly (myNewDomain: byref<AppDomain>) executableNameNoExe =
let executableName = executableNameNoExe + ".exe"
let myAsmName = AssemblyName()
myAsmName.Name <- executableNameNoExe
myAsmName.CodeBase <- Environment.CurrentDirectory
let myAsmBuilder =
myNewDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.RunAndSave)
printfn "-- Dynamic Assembly instantiated."
let myModBuilder =
myAsmBuilder.DefineDynamicModule(executableNameNoExe, executableName)
let myTypeBuilder =
myModBuilder.DefineType(executableNameNoExe,
TypeAttributes.Public,
typeof<MarshalByRefObject>)
let myFCMethod =
myTypeBuilder.DefineMethod("CountLocalFiles",
MethodAttributes.Public |||
MethodAttributes.Static,
null,
[||])
let currentDirGetMI = typeof<Environment>.GetProperty("CurrentDirectory").GetGetMethod()
let writeLine0objMI = typeof<Console>.GetMethod("WriteLine", [| typeof<string> |])
let writeLine2objMI = typeof<Console>.GetMethod("WriteLine", [| typeof<string>; typeof<obj>; typeof<obj> |])
let getFilesMI = typeof<Directory>.GetMethod("GetFiles", [| typeof<string> |])
myFCMethod.InitLocals <- true
let myFCIL = myFCMethod.GetILGenerator()
printfn "-- Generating MSIL method body..."
let v0 = myFCIL.DeclareLocal typeof<string>
let v1 = myFCIL.DeclareLocal typeof<int>
let v2 = myFCIL.DeclareLocal typeof<string>
let v3 = myFCIL.DeclareLocal typeof<string[]>
let evalForEachLabel = myFCIL.DefineLabel()
let topOfForEachLabel = myFCIL.DefineLabel()
// Build the method body.
myFCIL.EmitCall(OpCodes.Call, currentDirGetMI, null)
myFCIL.Emit(OpCodes.Stloc_S, v0)
myFCIL.Emit(OpCodes.Ldc_I4_0)
myFCIL.Emit(OpCodes.Stloc_S, v1)
myFCIL.Emit(OpCodes.Ldstr, "---")
myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, null)
myFCIL.Emit(OpCodes.Ldloc_S, v0)
myFCIL.EmitCall(OpCodes.Call, getFilesMI, null)
myFCIL.Emit(OpCodes.Stloc_S, v3)
myFCIL.Emit(OpCodes.Br_S, evalForEachLabel)
// foreach loop starts here.
myFCIL.MarkLabel topOfForEachLabel
// Load array of strings and index, store value at index for output.
myFCIL.Emit(OpCodes.Ldloc_S, v3)
myFCIL.Emit(OpCodes.Ldloc_S, v1)
myFCIL.Emit OpCodes.Ldelem_Ref
myFCIL.Emit(OpCodes.Stloc_S, v2)
myFCIL.Emit(OpCodes.Ldloc_S, v2)
myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, null)
// Increment counter by one.
myFCIL.Emit(OpCodes.Ldloc_S, v1)
myFCIL.Emit(OpCodes.Ldc_I4_1)
myFCIL.Emit OpCodes.Add
myFCIL.Emit(OpCodes.Stloc_S, v1)
// Determine if end of file list array has been reached.
myFCIL.MarkLabel evalForEachLabel
myFCIL.Emit(OpCodes.Ldloc_S, v1)
myFCIL.Emit(OpCodes.Ldloc_S, v3)
myFCIL.Emit OpCodes.Ldlen
myFCIL.Emit OpCodes.Conv_I4
myFCIL.Emit(OpCodes.Blt_S, topOfForEachLabel)
//foreach loop end here.
myFCIL.Emit(OpCodes.Ldstr, "---")
myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, null)
myFCIL.Emit(OpCodes.Ldstr, "There are {0} files in {1}.")
myFCIL.Emit(OpCodes.Ldloc_S, v1)
myFCIL.Emit(OpCodes.Box, typeof<int>)
myFCIL.Emit(OpCodes.Ldloc_S, v0)
myFCIL.EmitCall(OpCodes.Call, writeLine2objMI, null)
myFCIL.Emit OpCodes.Ret
let myType = myTypeBuilder.CreateType()
myAsmBuilder.SetEntryPoint myFCMethod
myAsmBuilder.Save executableName
printfn "-- Method generated, type completed, and assembly saved to disk."
myType
printf "Enter a name for the file counting assembly: "
let executableNameNoExe = stdin.ReadLine()
let executableName = executableNameNoExe + ".exe"
printfn "---"
let domainDir = Environment.CurrentDirectory
let mutable curDomain = Thread.GetDomain()
// Create a new AppDomain, with the current directory as the base.
printfn $"Current Directory: {Environment.CurrentDirectory}"
let mySetupInfo = AppDomainSetup()
mySetupInfo.ApplicationBase <- domainDir
mySetupInfo.ApplicationName <- executableNameNoExe
mySetupInfo.LoaderOptimization <- LoaderOptimization.SingleDomain
let myDomain =
AppDomain.CreateDomain(executableNameNoExe, null, mySetupInfo)
printfn $"Creating a new AppDomain '{executableNameNoExe}'..."
printfn $"-- Base Directory = '{myDomain.BaseDirectory}'"
printfn $"-- Shadow Copy? = '{myDomain.ShadowCopyFiles}'"
printfn "---"
let myFCType =
createADynamicAssembly &curDomain executableNameNoExe
printfn $"Loading '{executableName}' from '{myDomain.BaseDirectory}'..."
let bFlags =
BindingFlags.Public ||| BindingFlags.CreateInstance ||| BindingFlags.Instance
let myObjInstance =
myDomain.CreateInstanceAndUnwrap(executableNameNoExe,
executableNameNoExe, false, bFlags,
null, null, null, null, null)
printfn $"Executing method 'CountLocalFiles' in {myObjInstance}..."
myFCType.InvokeMember("CountLocalFiles", BindingFlags.InvokeMethod, null, myObjInstance, [||])
Imports System.IO
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.Remoting
Class ADDyno
Public Shared Function CreateADynamicAssembly(ByRef myNewDomain As AppDomain, executableNameNoExe As String) As Type
Dim executableName As String = executableNameNoExe + ".exe"
Dim myAsmName As New AssemblyName()
myAsmName.Name = executableNameNoExe
myAsmName.CodeBase = Environment.CurrentDirectory
Dim myAsmBuilder As AssemblyBuilder = myNewDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.RunAndSave)
Console.WriteLine("-- Dynamic Assembly instantiated.")
Dim myModBuilder As ModuleBuilder = myAsmBuilder.DefineDynamicModule(executableNameNoExe, executableName)
Dim myTypeBuilder As TypeBuilder = myModBuilder.DefineType(executableNameNoExe, TypeAttributes.Public, GetType(MarshalByRefObject))
Dim myFCMethod As MethodBuilder = myTypeBuilder.DefineMethod("CountLocalFiles", MethodAttributes.Public Or MethodAttributes.Static, Nothing, New Type() {})
Dim currentDirGetMI As MethodInfo = GetType(Environment).GetProperty("CurrentDirectory").GetGetMethod()
Dim writeLine0objMI As MethodInfo = GetType(Console).GetMethod("WriteLine", New Type() {GetType(String)})
Dim writeLine2objMI As MethodInfo = GetType(Console).GetMethod("WriteLine", New Type() {GetType(String), GetType(Object), GetType(Object)})
Dim getFilesMI As MethodInfo = GetType(Directory).GetMethod("GetFiles", New Type() {GetType(String)})
myFCMethod.InitLocals = True
Dim myFCIL As ILGenerator = myFCMethod.GetILGenerator()
Console.WriteLine("-- Generating MSIL method body...")
Dim v0 As LocalBuilder = myFCIL.DeclareLocal(GetType(String))
Dim v1 As LocalBuilder = myFCIL.DeclareLocal(GetType(Integer))
Dim v2 As LocalBuilder = myFCIL.DeclareLocal(GetType(String))
Dim v3 As LocalBuilder = myFCIL.DeclareLocal(GetType(String()))
Dim evalForEachLabel As Label = myFCIL.DefineLabel()
Dim topOfForEachLabel As Label = myFCIL.DefineLabel()
' Build the method body.
myFCIL.EmitCall(OpCodes.Call, currentDirGetMI, Nothing)
myFCIL.Emit(OpCodes.Stloc_S, v0)
myFCIL.Emit(OpCodes.Ldc_I4_0)
myFCIL.Emit(OpCodes.Stloc_S, v1)
myFCIL.Emit(OpCodes.Ldstr, "---")
myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, Nothing)
myFCIL.Emit(OpCodes.Ldloc_S, v0)
myFCIL.EmitCall(OpCodes.Call, getFilesMI, Nothing)
myFCIL.Emit(OpCodes.Stloc_S, v3)
myFCIL.Emit(OpCodes.Br_S, evalForEachLabel)
' foreach loop starts here.
myFCIL.MarkLabel(topOfForEachLabel)
' Load array of strings and index, store value at index for output.
myFCIL.Emit(OpCodes.Ldloc_S, v3)
myFCIL.Emit(OpCodes.Ldloc_S, v1)
myFCIL.Emit(OpCodes.Ldelem_Ref)
myFCIL.Emit(OpCodes.Stloc_S, v2)
myFCIL.Emit(OpCodes.Ldloc_S, v2)
myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, Nothing)
' Increment counter by one.
myFCIL.Emit(OpCodes.Ldloc_S, v1)
myFCIL.Emit(OpCodes.Ldc_I4_1)
myFCIL.Emit(OpCodes.Add)
myFCIL.Emit(OpCodes.Stloc_S, v1)
' Determine if end of file list array has been reached.
myFCIL.MarkLabel(evalForEachLabel)
myFCIL.Emit(OpCodes.Ldloc_S, v1)
myFCIL.Emit(OpCodes.Ldloc_S, v3)
myFCIL.Emit(OpCodes.Ldlen)
myFCIL.Emit(OpCodes.Conv_I4)
myFCIL.Emit(OpCodes.Blt_S, topOfForEachLabel)
'foreach loop end here.
myFCIL.Emit(OpCodes.Ldstr, "---")
myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, Nothing)
myFCIL.Emit(OpCodes.Ldstr, "There are {0} files in {1}.")
myFCIL.Emit(OpCodes.Ldloc_S, v1)
myFCIL.Emit(OpCodes.Box, GetType(Integer))
myFCIL.Emit(OpCodes.Ldloc_S, v0)
myFCIL.EmitCall(OpCodes.Call, writeLine2objMI, Nothing)
myFCIL.Emit(OpCodes.Ret)
Dim myType As Type = myTypeBuilder.CreateType()
myAsmBuilder.SetEntryPoint(myFCMethod)
myAsmBuilder.Save(executableName)
Console.WriteLine("-- Method generated, type completed, and assembly saved to disk.")
Return myType
End Function 'CreateADynamicAssembly
Public Shared Sub Main()
Dim executableName As String = Nothing
Dim domainDir As String
Console.Write("Enter a name for the file counting assembly: ")
Dim executableNameNoExe As String = Console.ReadLine()
executableName = executableNameNoExe + ".exe"
Console.WriteLine("---")
domainDir = Environment.CurrentDirectory
Dim curDomain As AppDomain = Thread.GetDomain()
' Create a new AppDomain, with the current directory as the base.
Console.WriteLine("Current Directory: {0}", Environment.CurrentDirectory)
Dim mySetupInfo As New AppDomainSetup()
mySetupInfo.ApplicationBase = domainDir
mySetupInfo.ApplicationName = executableNameNoExe
mySetupInfo.LoaderOptimization = LoaderOptimization.SingleDomain
Dim myDomain As AppDomain = AppDomain.CreateDomain(executableNameNoExe, Nothing, mySetupInfo)
Console.WriteLine("Creating a new AppDomain '{0}'...", executableNameNoExe)
Console.WriteLine("-- Base Directory = '{0}'", myDomain.BaseDirectory)
Console.WriteLine("-- Shadow Copy? = '{0}'", myDomain.ShadowCopyFiles)
Console.WriteLine("---")
Dim myFCType As Type = CreateADynamicAssembly(curDomain, executableNameNoExe)
Console.WriteLine("Loading '{0}' from '{1}'...", executableName, myDomain.BaseDirectory.ToString())
Dim bFlags As BindingFlags = BindingFlags.Public Or BindingFlags.CreateInstance Or BindingFlags.Instance
Dim myObjInstance As [Object] = myDomain.CreateInstanceAndUnwrap(executableNameNoExe, executableNameNoExe, False, bFlags, Nothing, Nothing, Nothing, Nothing, Nothing)
Console.WriteLine("Executing method 'CountLocalFiles' in {0}...", myObjInstance.ToString())
myFCType.InvokeMember("CountLocalFiles", BindingFlags.InvokeMethod, Nothing, myObjInstance, New Object() {})
End Sub
End Class
注釈
これは、 と ObjectHandle.Unwrapを組み合わせた便利なCreateInstanceメソッドです。 このメソッドは、 のパラメーターなしのコンストラクターを typeName
呼び出します。
の形式assemblyName
については、 を参照してくださいAssemblyName。 の形式typeName
については、 Type.FullName プロパティを参照してください。
注意
によってCreateInstanceAndUnwrap返された型T1
のオブジェクトのメソッドM
に対して事前バインドされた呼び出しを行い、そのメソッドが、現在のアセンブリまたは を含むアセンブリ以外のアセンブリC
内の型T2
のオブジェクトのメソッドに対して事前バインドされた呼び出しをT1
行うと、アセンブリC
が現在のアプリケーション ドメインに読み込まれます。 この読み込みは、 への T1.M()
事前バインディング呼び出しが の本体で行われた場合や、他の DynamicMethod動的に生成されたコードで行われた場合でも発生します。 現在のドメインが既定のドメインの場合、プロセスが終了するまでアセンブリ C
をアンロードすることはできません。 現在のドメインが後でアセンブリ C
を読み込もうとすると、読み込みが失敗する可能性があります。
こちらもご覧ください
適用対象
CreateInstanceAndUnwrap(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[])
- ソース:
- AppDomain.cs
- ソース:
- AppDomain.cs
- ソース:
- AppDomain.cs
指定したアセンブリで定義されている、指定した型の新しいインスタンスを作成します。型名の大文字と小文字の区別を無視するかどうか、作成する型を選択するために使用されるバインディング属性とバインダー、コンストラクターの引数、カルチャ、およびアクティベーション属性を指定します。
public:
System::Object ^ CreateInstanceAndUnwrap(System::String ^ assemblyName, System::String ^ typeName, bool ignoreCase, System::Reflection::BindingFlags bindingAttr, System::Reflection::Binder ^ binder, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture, cli::array <System::Object ^> ^ activationAttributes);
public object? CreateInstanceAndUnwrap (string assemblyName, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder? binder, object?[]? args, System.Globalization.CultureInfo? culture, object?[]? activationAttributes);
public object CreateInstanceAndUnwrap (string assemblyName, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, object[] args, System.Globalization.CultureInfo culture, object[] activationAttributes);
member this.CreateInstanceAndUnwrap : string * string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] -> obj
Public Function CreateInstanceAndUnwrap (assemblyName As String, typeName As String, ignoreCase As Boolean, bindingAttr As BindingFlags, binder As Binder, args As Object(), culture As CultureInfo, activationAttributes As Object()) As Object
パラメーター
- ignoreCase
- Boolean
検索で大文字と小文字を区別するかどうかを指定する Boolean 値。
- bindingAttr
- BindingFlags
typeName
コンストラクターの検索に影響を与える 0 個以上のビット フラグの組み合わせ。 bindingAttr
が 0 の場合は、大文字と小文字を区別してパブリック コンストラクターを検索します。
- binder
- Binder
バインディング、引数型の強制変換、メンバーの呼び出し、および、リフレクションを使用した MemberInfo オブジェクトの取得を有効にするオブジェクト。 binder
が null の場合は、既定のバインダーが使用されます。
- args
- Object[]
コンストラクターに渡される引数。 この引数の配列は、呼び出すコンストラクターのパラメーターに対して、数、順序、および型を一致させる必要があります。 パラメーターなしのコンストラクターを使用する場合は、args
を空の配列または null にする必要があります。
- culture
- CultureInfo
型の強制変換を制御するために使用するカルチャ固有のオブジェクト。 culture
が null
の場合は、現在のスレッドの CultureInfo
が使用されます。
- activationAttributes
- Object[]
アクティべーションに参加できる 1 つ以上の属性の配列。 一般的に、1 つの配列に 1 つの UrlAttribute オブジェクトが含まれます。 リモート オブジェクトのアクティブ化に必要な URL を指定します。
このパラメーターは、クライアント側でアクティブ化されるオブジェクトに関連しています。 クライアント アクティベーションは、下位互換性のために残されているレガシ テクノロジです。新規の開発には使用しないでください。 分散アプリケーションは、代わりに Windows Communication Foundation (WCF) を使用する必要があります。
戻り値
typeName
で指定したオブジェクトのインスタンス。
例外
assemblyName
または typeName
が null
です。
一致するコンストラクターが見つかりませんでした。
typename
が assemblyName
で見つかりませんでした。
assemblyName
が見つかりませんでした。
呼び出し元には、このコンストラクターを呼び出すアクセス許可がありません。
呼び出し元は、MarshalByRefObject を継承しないオブジェクトのアクティベーション属性を提供できません。
アンロードされたアプリケーション ドメインで操作しようとします。
assemblyName
は、現在読み込まれているランタイムの有効なアセンブリではありません。
アセンブリまたはモジュールが、2 つの異なる証拠を使用して 2 回読み込まれました。
例
次の例では、 パラメーターの使用方法を ignoreCase
示します。
using namespace System;
using namespace System::Reflection;
static void InstantiateINT32( bool ignoreCase )
{
try
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
Object^ instance = currentDomain->CreateInstanceAndUnwrap(
"mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"SYSTEM.INT32",
ignoreCase,
BindingFlags::Default,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr );
Console::WriteLine( instance->GetType() );
}
catch ( TypeLoadException^ e )
{
Console::WriteLine( e->Message );
}
}
int main()
{
InstantiateINT32( false ); // Failed!
InstantiateINT32( true ); // OK!
}
using System;
using System.Reflection;
class IgnoreCaseSnippet {
static void Main() {
InstantiateINT32(false); // Failed!
InstantiateINT32(true); // OK!
}
static void InstantiateINT32(bool ignoreCase) {
try {
AppDomain currentDomain = AppDomain.CurrentDomain;
object instance = currentDomain.CreateInstanceAndUnwrap(
"mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"SYSTEM.INT32",
ignoreCase,
BindingFlags.Default,
null,
null,
null,
null,
null
);
Console.WriteLine(instance.GetType());
} catch (TypeLoadException e) {
Console.WriteLine(e.Message);
}
}
}
open System
open System.Reflection
let instantiateINT32 ignoreCase =
try
let currentDomain = AppDomain.CurrentDomain
let instance = currentDomain.CreateInstanceAndUnwrap(
"mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"SYSTEM.INT32",
ignoreCase,
BindingFlags.Default,
null,
null,
null,
null,
null)
printfn $"{instance.GetType()}"
with :? TypeLoadException as e ->
printfn $"{e.Message}"
instantiateINT32 false // Failed!
instantiateINT32 true // OK!
Imports System.Reflection
Module Test
Sub Main()
InstantiateINT32(False) ' Failed!
InstantiateINT32(True) ' OK!
End Sub
Sub InstantiateINT32(ignoreCase As Boolean)
Try
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
Dim instance As Object = currentDomain.CreateInstanceAndUnwrap( _
"mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", _
"SYSTEM.INT32", _
ignoreCase, _
BindingFlags.Default, _
Nothing, _
Nothing, _
Nothing, _
Nothing, _
Nothing _
)
Console.WriteLine(instance.GetType())
Catch e As TypeLoadException
Console.WriteLine(e.Message)
End Try
End Sub
End Module 'Test
注釈
これは、 と ObjectHandle.Unwrapを組み合わせた便利なCreateInstanceメソッドです。
の形式assemblyName
については、 を参照してくださいAssemblyName。 の形式typeName
については、 Type.FullName プロパティを参照してください。
注意
によってCreateInstanceAndUnwrap返された 型T1
のオブジェクトのメソッドM
に対して事前バインド呼び出しを行い、そのメソッドが、現在のアセンブリまたは を含むアセンブリ以外のアセンブリC
内の型T2
のオブジェクトのメソッドに対して、事前バインドされた呼び出しをT1
行うと、アセンブリC
は現在のアプリケーション ドメインに読み込まれます。 この読み込みは、 の事前バインド呼び出し T1.M()
が の本体で行われた場合、または他の DynamicMethod動的に生成されたコードで行われた場合でも発生します。 現在のドメインが既定のドメインの場合、アセンブリ C
はプロセスが終了するまでアンロードできません。 現在のドメインが後でアセンブリ C
を読み込もうとすると、読み込みが失敗する可能性があります。
こちらもご覧ください
適用対象
CreateInstanceAndUnwrap(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[], Evidence)
注意事項
Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of CreateInstanceAndUnwrap which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.
指定した型の新しいインスタンスを作成します。 型の名前、およびその検索方法と作成方法をパラメーターで指定します。
public:
System::Object ^ CreateInstanceAndUnwrap(System::String ^ assemblyName, System::String ^ typeName, bool ignoreCase, System::Reflection::BindingFlags bindingAttr, System::Reflection::Binder ^ binder, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture, cli::array <System::Object ^> ^ activationAttributes, System::Security::Policy::Evidence ^ securityAttributes);
public object CreateInstanceAndUnwrap (string assemblyName, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, object[] args, System.Globalization.CultureInfo culture, object[] activationAttributes, System.Security.Policy.Evidence securityAttributes);
[System.Obsolete("Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of CreateInstanceAndUnwrap which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
public object CreateInstanceAndUnwrap (string assemblyName, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, object[] args, System.Globalization.CultureInfo culture, object[] activationAttributes, System.Security.Policy.Evidence securityAttributes);
member this.CreateInstanceAndUnwrap : string * string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] * System.Security.Policy.Evidence -> obj
[<System.Obsolete("Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of CreateInstanceAndUnwrap which does not take an Evidence parameter. See http://go.microsoft.com/fwlink/?LinkID=155570 for more information.")>]
member this.CreateInstanceAndUnwrap : string * string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] * System.Security.Policy.Evidence -> obj
Public Function CreateInstanceAndUnwrap (assemblyName As String, typeName As String, ignoreCase As Boolean, bindingAttr As BindingFlags, binder As Binder, args As Object(), culture As CultureInfo, activationAttributes As Object(), securityAttributes As Evidence) As Object
パラメーター
- ignoreCase
- Boolean
検索で大文字と小文字を区別するかどうかを指定する Boolean 値。
- bindingAttr
- BindingFlags
typeName
コンストラクターの検索に影響を与える 0 個以上のビット フラグの組み合わせ。 bindingAttr
が 0 の場合は、大文字と小文字を区別してパブリック コンストラクターを検索します。
- binder
- Binder
バインディング、引数型の強制変換、メンバーの呼び出し、および、リフレクションを使用した MemberInfo オブジェクトの取得を有効にするオブジェクト。 binder
が null の場合は、既定のバインダーが使用されます。
- args
- Object[]
コンストラクターに渡される引数。 この引数の配列は、呼び出すコンストラクターのパラメーターに対して、数、順序、および型を一致させる必要があります。 パラメーターなしのコンストラクターを使用する場合は、args
を空の配列または null にする必要があります。
- culture
- CultureInfo
型の強制変換を制御するために使用するカルチャ固有のオブジェクト。 culture
が null
の場合は、現在のスレッドの CultureInfo
が使用されます。
- activationAttributes
- Object[]
アクティべーションに参加できる 1 つ以上の属性の配列。 通常、リモート オブジェクトをアクティブ化するために必要な URL を指定する 1 つの UrlAttribute オブジェクトを含む配列。
このパラメーターは、クライアント側でアクティブ化されるオブジェクトに関連しています。 クライアント アクティベーションは、下位互換性のために残されているレガシ テクノロジです。新規の開発には使用しないでください。 分散アプリケーションは、代わりに Windows Communication Foundation (WCF) を使用する必要があります。
- securityAttributes
- Evidence
typeName
の作成を承認するために使用される情報。
戻り値
typeName
で指定したオブジェクトのインスタンス。
- 属性
例外
assemblyName
または typeName
が null
です。
一致するコンストラクターが見つかりませんでした。
typename
が assemblyName
で見つかりませんでした。
assemblyName
が見つかりませんでした。
呼び出し元には、このコンストラクターを呼び出すアクセス許可がありません。
呼び出し元は、MarshalByRefObject を継承しないオブジェクトのアクティベーション属性を提供できません。
アンロードされたアプリケーション ドメインで操作しようとします。
assemblyName
は、現在読み込まれているランタイムの有効なアセンブリではありません。
アセンブリまたはモジュールが、2 つの異なる証拠を使用して 2 回読み込まれました。
例
次の例では、 パラメーターの使用方法を ignoreCase
示します。
using namespace System;
using namespace System::Reflection;
static void InstantiateINT32( bool ignoreCase )
{
try
{
AppDomain^ currentDomain = AppDomain::CurrentDomain;
Object^ instance = currentDomain->CreateInstanceAndUnwrap(
"mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"SYSTEM.INT32",
ignoreCase,
BindingFlags::Default,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr );
Console::WriteLine( instance->GetType() );
}
catch ( TypeLoadException^ e )
{
Console::WriteLine( e->Message );
}
}
int main()
{
InstantiateINT32( false ); // Failed!
InstantiateINT32( true ); // OK!
}
using System;
using System.Reflection;
class IgnoreCaseSnippet {
static void Main() {
InstantiateINT32(false); // Failed!
InstantiateINT32(true); // OK!
}
static void InstantiateINT32(bool ignoreCase) {
try {
AppDomain currentDomain = AppDomain.CurrentDomain;
object instance = currentDomain.CreateInstanceAndUnwrap(
"mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"SYSTEM.INT32",
ignoreCase,
BindingFlags.Default,
null,
null,
null,
null,
null
);
Console.WriteLine(instance.GetType());
} catch (TypeLoadException e) {
Console.WriteLine(e.Message);
}
}
}
open System
open System.Reflection
let instantiateINT32 ignoreCase =
try
let currentDomain = AppDomain.CurrentDomain
let instance = currentDomain.CreateInstanceAndUnwrap(
"mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"SYSTEM.INT32",
ignoreCase,
BindingFlags.Default,
null,
null,
null,
null,
null)
printfn $"{instance.GetType()}"
with :? TypeLoadException as e ->
printfn $"{e.Message}"
instantiateINT32 false // Failed!
instantiateINT32 true // OK!
Imports System.Reflection
Module Test
Sub Main()
InstantiateINT32(False) ' Failed!
InstantiateINT32(True) ' OK!
End Sub
Sub InstantiateINT32(ignoreCase As Boolean)
Try
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
Dim instance As Object = currentDomain.CreateInstanceAndUnwrap( _
"mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", _
"SYSTEM.INT32", _
ignoreCase, _
BindingFlags.Default, _
Nothing, _
Nothing, _
Nothing, _
Nothing, _
Nothing _
)
Console.WriteLine(instance.GetType())
Catch e As TypeLoadException
Console.WriteLine(e.Message)
End Try
End Sub
End Module 'Test
注釈
これは、 と ObjectHandle.Unwrapを組み合わせた便利なCreateInstanceメソッドです。
の形式assemblyName
については、 を参照してくださいAssemblyName。 の形式typeName
については、 Type.FullName プロパティを参照してください。
注意
によってCreateInstanceAndUnwrap返された 型T1
のオブジェクトのメソッドM
に対して事前バインド呼び出しを行い、そのメソッドが、現在のアセンブリまたは を含むアセンブリ以外のアセンブリC
内の型T2
のオブジェクトのメソッドに対して、事前バインドされた呼び出しをT1
行うと、アセンブリC
は現在のアプリケーション ドメインに読み込まれます。 この読み込みは、 の事前バインド呼び出し T1.M()
が の本体で行われた場合、または他の DynamicMethod動的に生成されたコードで行われた場合でも発生します。 現在のドメインが既定のドメインの場合、アセンブリ C
はプロセスが終了するまでアンロードできません。 現在のドメインが後でアセンブリ C
を読み込もうとすると、読み込みが失敗する可能性があります。
こちらもご覧ください
適用対象
.NET
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示