0

我正在使用以下内容在我的代码中链接运行时的外部资源之一:

System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom("MyNice.dll");
            Type type = assembly.GetType("MyType");
            Tool = Activator.CreateInstance(type) as Tool;

现在您可以看到,在对象创建结束时,它必须将生成的对象转换为工具类,因为在我的代码中有很多对工具类的方法和属性的引用,如果不存在则代码将在编译时出错。

现在,这是一个糟糕的情况,因为我想从我的引用中删除 Dll 并在运行时动态加载它,但同时我的一些代码引用并依赖于 Tool 程序集。我怎样才能让它独立?我是否必须在我的代码中使用反射,或者那里有任何简单的替代方法?

例如:

if (Tool.ApplicationIsOpen)
                    return StatusResult.Success;

是否存在假定 Tool 类已经存在并且如果我从我的引用文件夹中删除它会中断的同一个类。

有什么建议吗?

4

1 回答 1

1

我建议让共享 DLL 从包含 Tool 继承的接口的两个项目中引用。

在这个共享项目中,创建一个接口,例如 ITool,它公开了消费者项目所需的功能。

共享项目

public interface ITool
{
    void Something();
}

独立项目

public class Tool : ITool
{
    public void Something()
    {
        // do something
    }
}

消费者项目

System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom("MyNice.dll");
Type type = assembly.GetTypes().FirstOrDefault(t => t.IsAssignableFrom(typeof(ITool)));
ITool tool = Activator.CreateInstance(type) as ITool;

现在您可以删除对包含 Tool 的项目的引用,但您仍然需要对包含 ITool 的共享项目的引用。如果你真的不想要任何参考,那么探索反射路线,但要注意它可能会很混乱。

这种策略是许多插件系统的基础。我建议您查看一些可以为您完成大量此类繁重工作的依赖注入(简称 DI)库。

以下是 DI 库列表:http ://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx 我个人最近一直在使用 Ninject。

一些相关链接:

于 2013-08-22T05:11:18.660 回答