アセンブリの動的読み込みと、それらのアセンブリからのクラス インスタンスの作成に関する小さなコードを作成しました。これには、実行可能ファイル、動的に読み込まれるテスト ライブラリ、および動的アセンブリを新しい .xml ファイルに読み込むローダー ライブラリが含まれますAppdomain
。ローダー ライブラリは、実行可能ライブラリと動的ライブラリの両方から参照されます。
//executable
[System.STAThreadAttribute()]
[System.LoaderOptimization(LoaderOptimization.MultiDomain)]
static void Main(string[] args)
{
AppDomainSetup domainSetup = new AppDomainSetup()
{
ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile,
ApplicationName = AppDomain.CurrentDomain.SetupInformation.ApplicationName,
LoaderOptimization = LoaderOptimization.MultiDomain
};
AppDomain childDomain = AppDomain.CreateDomain("MyDomain", null, domainSetup);
Console.WriteLine(AppDomain.CurrentDomain.SetupInformation.LoaderOptimization.ToString());
Console.WriteLine(childDomain.SetupInformation.LoaderOptimization.ToString());
byte[] assembly = null;
string assemblyName = "CSTestLib";
using (FileStream fs = new FileStream(assemblyName+".dll",FileMode.Open))
{
byte[] byt = new byte[fs.Length];
fs.Read(byt,0,(int)fs.Length);
assembly = byt;
}
object[] pararmeters = {assemblyName,assembly};
string LoaderAssemblyName = typeof(AssemblyLoader).Assembly.FullName;
string LoaderClassName = typeof(AssemblyLoader).FullName;
AssemblyLoader assloader = (AssemblyLoader)childDomain.CreateInstanceAndUnwrap(LoaderAssemblyName,LoaderClassName , true, BindingFlags.CreateInstance, null, parameters, null, null);
object obj = assloader.Load("CSTestLib.Class1");
object obj2 = assloader.Load("CSTestLib.Class2");
AppDomain.Unload(childDomain);
Console.ReadKey();
}
//Dynamic Lib
using System;
namespace CSTestLib
{
public class Class1 :MarshalByRefObject
{
public Class1() { }
}
public class Class2 : MarshalByRefObject
{
public Class2() { }
}
}
//Loader Library
using System;
namespace LoaderLibrary
{
public class AssemblyLoader : MarshalByRefObject
{
string assemblyName;
public AssemblyLoader(string assName, byte[] ass)
{
assemblyName = assName;
AppDomain.CurrentDomain.Load(ass);
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName + " " + AppDomain.CurrentDomain.SetupInformation.LoaderOptimization.ToString());
}
public object Load(string className)
{
object ret = null;
try
{
ret = AppDomain.CurrentDomain.CreateInstanceAndUnwrap(assemblyName, className);
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
return ret;
}
}
}
ここで私は方法を設定
LoaderOptimizationAttribute
しましたが、それはなぜですか?main()
AppDomain.CurrentDomain.SetupInformation.LoaderOptimization.ToString();
NotSpecified
との違いは
MultiDomain
、MultiDomainHost
私にはあまり明確ではありません。MultiDomainHost
GACアセンブリのみですか?私の状況では、どちらがより適していますか?これによると
JIT コンパイルされたコードは、Assembly クラスの LoadFrom メソッドを使用してロード元コンテキストに読み込まれたアセンブリ、またはバイト配列を指定する Load メソッドのオーバーロードを使用してイメージから読み込まれたアセンブリに対して共有することはできません。
では、アセンブリがドメイン中立にロードされているかどうかをどのように検出できますか? ドメインニュートラルにロードされていることをどのように保証できますか?