Как вызвать метод из внешней сборки - PullRequest
0 голосов
/ 02 августа 2020

У меня есть образец c# проект:

namespace SampleExe
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

И у меня есть образец c# dll:

namespace SampleDll
{
    public class Program
    {
        public static void TestMethod(string samplestr)
        {
            Console.WriteLine("TestMethod Void Runned! Your string is: "+samplestr);
        }
    }
}

Как я могу вызвать TestMethod () из скомпилированной SampleDll.DLL (хочу загрузить внешнюю dll)

Ответы [ 3 ]

0 голосов
/ 02 августа 2020

Для этого нужно использовать отражение.

            var assembly = Assembly.Load(File.ReadAllBytes("SampleDLL.dll"));

            foreach(Type type in assembly.GetExportedTypes())
            {
                var c = Activator.CreateInstance(type);
                type.InvokeMember("TestMethod", BindingFlags.InvokeMethod, null, c, new object[] { @"Hi!" });
            }
0 голосов
/ 04 августа 2020

Вот рабочий пример использования Reflection для загрузки библиотеки во время выполнения и выполнения метода stati c. Обратите внимание, что он предполагает довольно многое: вы должны заранее знать имя библиотеки, имя класса, имя метода и все его аргументы. Часто намного проще просто сослаться на библиотеку напрямую.

Отличный способ успешно использовать Reflection - вместе с наследованием / интерфейсами. Библиотека A содержит базовый класс или интерфейс, а библиотека B содержит производный класс. Библиотека A может использовать отражение для загрузки библиотеки B, а затем найти все типы классов в библиотеке B , которые являются производными от базового класса или интерфейса (используя Type.IsAssignableFrom ). Таким образом, библиотека A будет иметь строго типизированные свойства и методы для работы, поступающие из базы, вместо того, чтобы знать строковые имена классов, методов и свойств в библиотеке B a priori .

Код для основного EXE, выполняющего отражение:

using System;
using System.IO;
using System.Linq;
using System.Reflection;

namespace SomeNamespace
{
    public class Program
    {
        static void Main()
        {
            string pathToSampleDLL = "<if you know the path ahead of time, use it>";

            // if SampleDLL.dll is in same directory as this EXE (a common occurrence):
            string workingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            pathToSampleDLL = Path.Combine(workingDirectory, "SampleDLL.dll");

            // load the DLL at runtime
            Assembly sampleDLL = Assembly.LoadFrom(pathToSampleDLL);

            // since you know the type name, you can use LINQ to return your type:
            Type sampleType = sampleDLL.GetTypes().FirstOrDefault(t => t.Name == "Program");

            // you are looking for a static method on this type, and you know its name, so use GetMethods:
            MethodInfo staticMethod = sampleType.GetMethod("TestMethod", BindingFlags.Public | BindingFlags.Static);

            // invoke the method.  Since you know its arguments and return value ahead of time, just hard code it:
            // you can use null for the object since this is a static method.  It takes only one argument, a sample string
            staticMethod.Invoke(null, new object[] { "sampleStr" });
        }
    }
}

Код для библиотеки образцов (скомпилирован в «SampleDLL.dll»):

using System;

namespace SampleDll
{
    public class Program
    {
        public static void TestMethod(string sampleStr)
        {
            Console.WriteLine("TestMethod Void Runned! Your string is: " + sampleStr);
        }
    }
}
0 голосов
/ 02 августа 2020

У вас есть несколько вариантов для этого. Вы можете создать dll и добавить dll в качестве ссылки на проект. Вы также можете добавить проект в качестве ссылки. Вы также можете создать пакет NuGet с dll и использовать его.

Затем просто позвоните SampleDll.Program.TestMethod

...