回答:
はい。を使用Assembly.LoadFrom
してアセンブリをメモリにロードしてから、を使用Activator.CreateInstance
して、好みのタイプのインスタンスを作成できます。まず、リフレクションを使用してタイプを調べる必要があります。以下に簡単な例を示します。
Assembly assembly = Assembly.LoadFrom("MyNice.dll");
Type type = assembly.GetType("MyType");
object instanceOfMyType = Activator.CreateInstance(type);
アセンブリファイル名とタイプ名がある場合、を使用Activator.CreateInstance(assemblyName, typeName)
して.NETタイプ解決にタイプを解決するよう要求できます。これをtry / catchでラップすると、失敗した場合に、検索されない可能性がある追加のアセンブリを具体的に格納できるディレクトリの検索を実行できます。これは、その時点で前述の方法を使用します。
Type type = assembly.GetType("MyNamespace"+"."+"MyType");
Activator.CreateInstanceが機能するはずです。
IFace object = (IFace)Activator.CreateInstance( "AssemblyName",
"TypeName" )
.Unwrap();
注:タイプ名は完全修飾タイプでなければなりません。
例:
var aray = (IList)Activator.CreateInstance("mscorlib","System.Collections.ArrayList").Unwrap();
aray.Add(10);
foreach (object obj in aray)
{
Console.WriteLine(obj);
}
TypeName
完全に修飾されている必要があります。私はこれを次のように呼び出さなければなりませんでした:Activator.CreateInstance("MyAssembly","MyAssembly.TypeName")
そして、それはを返しますObjectHandle
。インターフェースを使い始めるには、次のことを行う必要がありますObjectHandle.UnWrap()
この質問といくつかの回答は非常に役に立ちましたが、パスの問題がありました。そのため、この回答は、binディレクトリのパスを見つけることでライブラリの読み込みをカバーします。
最初の解決策:
string assemblyName = "library.dll";
string assemblyPath = HttpContext.Current.Server.MapPath("~/bin/" + assemblyName);
Assembly assembly = Assembly.LoadFrom(assemblyPath);
Type T = assembly.GetType("Company.Project.Classname");
Company.Project.Classname instance = (Company.Project.Classname) Activator.CreateInstance(T);
第二の解決策
string assemblyName = "library.dll";
string assemblyPath = HttpContext.Current.Server.MapPath("~/bin/" + assemblyName);
Assembly assembly = Assembly.LoadFile(assemblyPath);
(Company.Project.Classname) instance = (Company.Project.Classname) assembly.CreateInstance("Company.Project.Classname");
次のように、インターフェースにも同じ原則を使用できます(クラスを作成しますが、インターフェースにキャストします)。
(Company.Project.Interfacename) instance = (Company.Project.Interfacename) assembly.CreateInstance("Company.Project.Classname");
この例はWebアプリケーション用ですが、デスクトップアプリケーションにも同様に使用できます。たとえば、パスのみが異なる方法で解決されます。
Path.GetDirectoryName(Application.ExecutablePath)
それは簡単です。
MSDNの例:
public static void Main()
{
// Use the file name to load the assembly into the current
// application domain.
Assembly a = Assembly.Load("example");
// Get the type to use.
Type myType = a.GetType("Example");
// Get the method to call.
MethodInfo myMethod = myType.GetMethod("MethodA");
// Create an instance.
object obj = Activator.CreateInstance(myType);
// Execute the method.
myMethod.Invoke(obj, null);
}
ここに参照リンクがあります
Framework v4.5以降では、Activator.CreateInstanceFrom()を使用して、アセンブリ内でクラスを簡単にインスタンス化できます。次の例は、それを使用する方法と、パラメーターを渡して戻り値を取得するメソッドを呼び出す方法を示しています。
// Assuming moduleFileName contains full or valid relative path to assembly
var moduleInstance = Activator.CreateInstanceFrom(moduleFileName, "MyNamespace.MyClass");
MethodInfo mi = moduleInstance.Unwrap().GetType().GetMethod("MyMethod");
// Assuming the method returns a boolean and accepts a single string parameter
bool rc = Convert.ToBoolean(mi.Invoke(moduleInstance.Unwrap(), new object[] { "MyParamValue" } ));
はい。個人的に利用可能な例は今のところありません。後で見つけたら投稿します。基本的に、リフレクションを使用してアセンブリをロードし、必要なタイプをプルします。
それまでの間、このリンクから始めてください。
((ISomeInterface)Activator.CreateInstance(Assembly.LoadFile("somePath").GetTypes()[0])).SomeInterfaceMethod();
* Assembly.Load **メソッドを使用してアセンブリをロードできます。Activator.CreateInstanceを使用すると、必要なタイプの新しいインスタンスを作成できます。ロードするクラスの完全な型名を使用する必要があることに注意してください(たとえば、Namespace.SubNamespace.ClassName)。TypeクラスのメソッドInvokeMemberを使用して、型のメソッドを呼び出すことができます。
また、一度読み込まれると、AppDomain全体がアンロードされるまでアセンブリをアンロードできないことも考慮してください(これは基本的にメモリリークです)。
Assembly assembly = Assembly.LoadFrom("MyAssembly.dll");
Type type = assembly.GetType("MyType");
dynamic instanceOfMyType = Activator.CreateInstance(type);
したがって、このようにして、methodinfoを取得せずに関数を使用してから、それを呼び出すことができます。このinstanceOfMyType.MethodName();のようにします。ただし、動的型はコンパイル時ではなく実行時に入力されるため、Intellisenseを使用することはできません。