アセンブリを別の appdomain にロードする場合は、当然、そこでインスタンスを作成し、そこで使用する必要があります。それ以外は、どのような問題が発生したかわかりません。
アップデート
- リストからタイプを選択するコードを追加
- ドメイン全体で型名のみを文字列として渡すように変更
using System;
using System.IO;
using System.Reflection;
using System.Runtime.Remoting;
public class MainClass : MarshalByRefObject
{
static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("usage: {0} assembly", Path.GetFileName(Assembly.GetExecutingAssembly().Location));
return;
}
AppDomain other = AppDomain.CreateDomain("other");
Type myType = typeof(MainClass);
// create a loader instance in the new domain
MainClass loader = (MainClass)other.CreateInstanceAndUnwrap(myType.Assembly.FullName, myType.FullName);
string assemblyName;
string[] types = loader.LoadAssembly(args[0], out assemblyName);
Console.WriteLine("Loaded assembly {0}.", assemblyName);
Console.WriteLine("Types:");
for(int i = 0; i < types.Length; i += 1)
{
Console.WriteLine("[{0}] {1}", i, types[i]);
}
Console.Write("Enter index of type to create, -1 to exit: ");
int create = Int32.Parse(Console.ReadLine());
if (create < 0)
{
return;
}
Console.WriteLine("Creating instance of type {0}", types[create]);
Console.WriteLine("Type of the created instance was: {0}", loader.CreateInstance(assemblyName, types[create]));
}
string[] LoadAssembly(string path, out string assemblyName)
{
Console.WriteLine("LoadAssembly executing in appdomain {0}", AppDomain.CurrentDomain.FriendlyName);
Assembly assembly = Assembly.Load(File.ReadAllBytes(path));
assemblyName = assembly.FullName;
return Array.ConvertAll<Type, string>(assembly.GetExportedTypes(), x => x.FullName);
}
string CreateInstance(string assemblyName, string typeName)
{
Console.WriteLine("CreateInstance executing in appdomain {0}", AppDomain.CurrentDomain.FriendlyName);
object instance = Activator.CreateInstance(assemblyName, typeName).Unwrap();
// do something useful with the instance here
return instance.GetType().FullName;
}
public override object InitializeLifetimeService()
{
return null;
}
}
の出力例log4net.dll
:
$ mono main.exe log4net.dll
LoadAssembly executing in appdomain other
Loaded assembly log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=a5715cc6d5c3540b.
Types:
[0] log4net.Core.SecurityContext
[1] log4net.Core.LoggerWrapperImpl
[2] log4net.Core.LogImpl
[3] log4net.Core.DefaultRepositorySelector
...
[160] log4net.Appender.AspNetTraceAppender
[161] log4net.Appender.FileAppender
...
[197] log4net.Repository.LoggerRepositoryConfigurationResetEventHandler
[198] log4net.Repository.LoggerRepositoryConfigurationChangedEventHandler
Enter index of type to create, -1 to exit: 161
Creating instance of type log4net.Appender.FileAppender
CreateInstance executing in appdomain other
Type of the created instance was: log4net.Appender.FileAppender