Возникла потребность вынести часть кода на сервер в виде библиотеки DLL. Задача скачать DLL в память, и из памяти использовать методы DLL.
По своей задаче нашёл один ответ, но как вызвать свой метод мне не понятно.
WebClient webClient = new WebClient();
byte[] assemblyBytes = webClient.DownloadData("https://mysite.com");
var assembly = Assembly.Load(assemblyBytes);
var types = assembly.DefinedTypes;
Как вызвать методы DLL скачанной в память ?
К примеру DLL написан на C# и имеет такою структуру.
class myClass
{
public static int GetSum(int arg)
{
return arg;
}
public static int GetNum(int arg)
{
return arg;
}
public static int GetId(int arg)
{
return arg;
}
}
Ответ
Пример вызова статического метода:
var type = assembly.GetType("Namespace.TypeName");
var method = type.GetMethod("StaticMethod");
var result = method.Invoke(null, new object[] { param1, param2 });
Но лучше всего будет задать некий интерфейс/базовый класс в вашей программе, а класс в скачиваемой длл должен реализовать интерфейс/наследовать класс. Например вот так:
// интерфейс в вашей программе
public interface IRemote
{
int DoSomething(string param1, int param2);
}
// его реализация в скачиваемой длл, она должна иметь референс на вашу программу
public class RemoteClass : IRemote
{
public int DoSomething(string param1, int param2)
{
Console.WriteLine(param1);
}
}
И дальше вы делаете так:
var type = assembly.GetType("Namespace.RemoteClass");
var remote = (IRemote)Activator.CreateInstance(type);
remote.DoSomething("qwerty", 100);
Преимущества этого подхода в том, что вам не нужно каждый метод получать при помощи GetMethod, и исключаются ошибки, когда передаются неправильные параметры при вызове MethodInfo.Invoke
Комментариев нет:
Отправить комментарий