C# - 没有引用它执行从.NET的DLL(类库)代码?(C# - Execute code fro

2019-09-23 11:44发布

我试图在其中找到我可以从一个.NET的DLL我的应用程序已经启动后执行代码的方式。 我已经包括下面一些伪代码可能会试着解释什么,我试图做的。 我知道这可能是一个复杂多了,比我使它看起来。

ClassLibrary myLibrary = new ClassLibrary("C:\\Users\\Admin\\Desktop\\myTestLibrary.dll");
myLibrary.executeMethod("showMessageMethod", arg1, arg2, arg3...);

这就是我想做的事情,虽然我知道这是很可能比复杂得多!

我还想说清楚,我不明白 ,你注定要引用库在您的项目等等......但我的项目要求我不要做这种方式。

提前致谢!

Answer 1:

你需要从磁盘加载组件,如下所示:

Assembly myLibrary = System.Reflection.Assembly
    .LoadFile("C:\\Users\\Admin\\Desktop\\myTestLibrary.dll");

之后,你将需要使用反射来得到正确的类型,并调用适当的方法。 这将是最方便的,当你想调用类实现了在在启动过程中引用的程序集中定义的接口:

Type myClass = (
    from type in myLibrary.GetExportedTypes()
    where typeof(IMyInterface).IsAssignableFrom(type)
    select type)
    .Single();

var instance = (IMyInterface)Activator.CreateInstance(myClass);

instance.executeMethod("showMessageMethod", arg1, arg2, arg3...);


Answer 2:

我希望下面的代码示例帮助。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace zielonka.co.uk.stackoverflow.examples.Reflection
{
    class Program
    {
        static void Main(string[] args)
        {

            // dynamically load assembly from file Test.dll
            Assembly testAssembly = Assembly.LoadFile(@"c:\Test.dll");


            // get type of class Calculator from just loaded assembly
            Type calcType = testAssembly.GetType("Test.Calculator");


            // create instance of class Calculator
            object calcInstance = Activator.CreateInstance(calcType);

            // get info about property: public double Number
            PropertyInfo numberPropertyInfo = calcType.GetProperty("Number");

            // get value of property: public double Number
            double value = (double)numberPropertyInfo.GetValue(calcInstance, null);

            // set value of property: public double Number
            numberPropertyInfo.SetValue(calcInstance, 10.0, null);

            // get info about static property: public static double Pi
            PropertyInfo piPropertyInfo = calcType.GetProperty("Pi");

            // get value of static property: public static double Pi
            double piValue = (double)piPropertyInfo.GetValue(null, null);

            // invoke public instance method: public void Clear()
            calcType.InvokeMember("Clear",
                BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
                null, calcInstance, null);

            // invoke private instance method: private void DoClear()
            calcType.InvokeMember("DoClear",
                BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
                null, calcInstance, null);

            // invoke public instance method: public double Add(double number)
            double value = (double)calcType.InvokeMember("Add",
                BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
                null, calcInstance, new object[] { 20.0 });

            // invoke public static method: public static double GetPi()
            double piValue = (double)calcType.InvokeMember("GetPi",
                BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,
                null, null, null);


            // get value of private field: private double _number
            double value = (double)calcType.InvokeMember("_number",
                BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic,
                null, calcInstance, null);

        }
    }
}


Answer 3:

而在史蒂芬的回答详细的您可以加载该程序集,存在另一种可能性。

您添加引用您的解决方案的组件,但不作为解决方案的一部分部署的组件。 这意味着你不必使用反射,而不是使用AppDomain.AssemblyResolve事件。

您的需求是不明确的,但本质上这是注入DLL的方式。

例如,说你有DLL来实现你的数据库操作为您支持的每个后端。

当你的代码试图找到组件,它会在平时的地方,如果它没有被加载,并且不能找到,AssmemblyResolve事件触发,并在那里你动态地从一些访问的位置基于一些配置选项加载它。

方便的地点,可以是一个网址,一个完全不同的道路,即使网络路径。 不为这个例子很明显,但它甚至可以从数据库中的BLOB。



Answer 4:

第一种方法是使用:

Assembly asm = Assembly.LoadFrom(path);

第二个是: MEF



Answer 5:

What you are looking for is probably a way to dynamically load an assembly at runtime.

Look at this video: http://www.youtube.com/watch?v=WBoA36pwxJE



文章来源: C# - Execute code from a .NET DLL (Class Library) without referencing it?
标签: c# class dll