Способ встраивания / ссылки на другую сборку DLL при вызове метода с использованием C# Reflection
Есть ли способ вызывать методы с использованием C# Reflection со встроенными / ссылочными dll?
Например, рассмотрим следующий Senario. У меня есть вызов сборки User.dll, который имеет класс ниже
namespace User
{
public class UserInfo
{
public static string Name = "Username";
}
}
Используя вышеупомянутую dll в качестве ссылки, я могу скомпилировать следующий код и получить доступ к переменной UserInfo.Name.
using User;
using System.Windows.Forms;
public class Test
{
public Test()
{
MessageBox.Show("Name : " + UserInfo.Name);
}
}
Учтите, что приведенный выше код находится в другой DLL-сборке под названием Test.dll. Используя Assembly.LoadFile("Test.dll") и C# Reflection, когда я пытаюсь вызвать конструктор, получаю ошибку времени выполнения File not found.
ошибка
System.Reflection.TargetInvocationException: исключение было сгенерировано целью вызова. ---> System.IO.FileNotFoundException: не удалось загрузить файл или сборку 'DynamicAssembly, версия =0.0.0.0, культура = нейтральная, PublicKeyToken=null' или одна из ее зависимостей. Система не может найти указанный файл. at Test..ctor() --- Конец внутренней трассировки стека исключений --- в System.RuntimeMethodHandle.InvokeMethod(аргументы Object target, Object[], сигнатура сигнатуры, логический конструктор) в System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, связыватель Binder, параметры Object [], культура CultureInfo) в System.Reflection.ConstructorInfo.Invoke(параметры Object [])
1 ответ
У меня такая же проблема.
Я просто скопировал DLL в папку bin проекта.
Метод Assembly.LoadFile загружает только указанный файл. Вы должны использовать метод Assembly.LoadFrom в вашем случае. Пожалуйста, проверьте различия между Assembly.LoadFile и Assembly.LoadFrom
LoadFrom () проходит через Fusion и может быть перенаправлен на другую сборку по другому пути, но с тем же идентификатором, если он уже загружен в контексте LoadFrom.
LoadFile () не связывается через Fusion вообще - загрузчик просто идет вперед и загружает ровно * то, что запросил вызывающий. Он не использует ни контекст Load, ни LoadFrom.
Ваш пример исполняемого кода будет выглядеть как
static void Main(string[] args)
{
var fileName = ""; //put here test.dll path
Assembly ass = Assembly.LoadFrom(fileName);
var type = ass.GetType("Test.Test");
var test = Activator.CreateInstance(type);
}