Способ встраивания / ссылки на другую сборку 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);
    }
Другие вопросы по тегам