У меня есть consoleapp, загружающий одну dll в новый домен приложения, и я могу вызвать метод в этой dll.Я хотел бы иметь возможность вызвать этот метод снова без перезагрузки DLL.Предпочтительно я хотел бы иметь возможность загружать несколько dll и вызывать метод из любого из них перед выгрузкой домена приложения.
using System;
using System.Reflection;
namespace Parent
{
public interface ILoader
{
int Execute(int arg1, int arg2);
}
public class Loader : MarshalByRefObject, ILoader
{
public int Execute(int arg1, int arg2)
{
byte[] test1 = System.IO.File.ReadAllBytes("C:\\Users\\username\\source\\repos\\Test\\Test\\bin\\Debug\\Test.dll");
Assembly test = Assembly.Load(test1);
foreach (Type type in test.GetTypes())
{
if (type.ToString().ToUpper() == "PROGRAM")
{
var o = Activator.CreateInstance(type);
Console.WriteLine("found Program");
MethodInfo method = type.GetMethod("math", new[] { typeof(int), typeof(int) });
var returnvalue = method.Invoke(o, new object[] { arg1, arg2 });
return (int)returnvalue;
}
return 0;
}
return 0;
}
}
class Program
{
static void Main(string[] args)
{
int arg1 = Convert.ToInt32(args[0]);
int arg2 = Convert.ToInt32(args[1]);
Console.WriteLine(args[0], args[1]);
var domain = AppDomain.CreateDomain("child");
var loader = (ILoader)domain.CreateInstanceAndUnwrap(typeof(Loader).Assembly.FullName, typeof(Loader).FullName);
Console.Out.WriteLine(loader.Execute(arg1, arg2));
//reloads appdomain I dont want that
Console.Out.WriteLine(loader.Execute(2, 3));
Console.ReadKey();
AppDomain.Unload(domain);
Console.WriteLine("Appdomain unloaded");
Console.ReadKey();
}
}
}
Тестовая DLL,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
class Program
{
public static int math(int arg1, int arg2)
{
int a = arg1;
int b = arg2;
int c = a + b;
return c;
}
}