Загрузка DLL во внешнюю программу? - PullRequest
4 голосов
/ 20 января 2012

У меня есть C # ClassLibrary, которая содержит функцию для суммирования двух чисел:

namespace ClassLibrary1
{
    public class Calculator
    {
        public int Calc(int i, int b) {
            return i + b;
        }
    }
}

Я хочу загрузить эту DLL из другого приложения C # извне. Как я могу это сделать?

Ответы [ 4 ]

12 голосов
/ 20 января 2012

Вы хотите загрузить динамически, по имени файла?Тогда да, вы можете использовать метод Assembly.LoadFile следующим образом:

// Load the assembly
Assembly a = Assembly.LoadFile(@"C:\Path\To\Your\DLL.dll");

// Load the type and create an instance
Type t = a.GetType("ClassLibrary1.Calculator");
object instance = a.CreateInstance("ClassLibrary1.Calculator");

// Call the method
MethodInfo m = t.GetMethod("Calc");
m.Invoke(instance, new object[] {}); // Get the result here

(Перевод примера с здесь , но я написал его, так что не волнуйтесь!)

2 голосов
/ 20 января 2012

Просто опираясь на ответ от Minitech. Если вы можете использовать C # 4.0, вы можете опустить некоторые вызовы отражения.

    public static void Main()
    {  
       Assembly ass = Assembly.LoadFile(@"PathToLibrar\ClassLibraryTest.dll");
       var type = ass.GetType("ClassLibrary1.Calculator");
       dynamic instance = Activator.CreateInstance(type);
       int add = instance.Calc(1, 3);
    }

Здесь как instance типа dynamic, вы ненадо найти метод Calc по рефлексии.

Но лучший способ - это определить интерфейс вверх по потоку

 public interface ICalculator
    {
        int Calc(int i, int b);
    }

и реализовать его в своем классе вниз по течению

public class Calculator : ICalculator
{
    public int Calc(int i, int b)
    {
        return i + b;
    }
}

Тогда вы можете минимально отразить отражение для построенияобъект.

    public static void Main()
    {  
       Assembly ass = Assembly.LoadFile(@"PathToLibrar\ClassLibraryTest.dll");
       var type = ass.GetType("ClassLibrary1.Calculator");
       ICalculator instance = Activator.CreateInstance(type) as ICalculator;
       int add = instance.Calc(1, 3);
    }

Это даст вам наилучшую производительность.

0 голосов
/ 20 января 2012

В случае, если вы используете visual studio, вы можете сослаться на эту dll в своем проекте, а затем включить пространство имен в новый исходный код

0 голосов
/ 20 января 2012

Щелкните правой кнопкой мыши на References в проводнике проекта в Visual Studio и просто выберите сборку.Тогда вы можете использовать его:

using ClassLibrary1;

class Program
{
    static void Main()
    {
        Calculator calc = new Calculator();
        int result = calc.Cal(1, 2);
    }
}
...