如何在编译时保持动态加载的程序集破坏代码?

时间:2013-08-21 23:43:22

标签: c# .net runtime dynamic-linking compile-time

我正在使用以下内容在我的代码中以runetime链接其中一个外部资源:

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

现在您可以看到,在对象创建结束时,它必须将结果对象强制转换为工具类,因为在我的代码中有很多对Tool类的方法和属性的引用,如果它是没有那么代码会在编译时出错。

现在,这是一个糟糕的情况,因为我想从我的引用中删除Dll并让它在运行时动态加载,但同时我的代码片段引用并依赖于工具程序集。我该如何让它独立?我是否必须在我的代码中使用反射,或者有任何简单的替代方案吗?

例如:

if (Tool.ApplicationIsOpen)
                    return StatusResult.Success;

是否在同一个类中,假设Tool类已经存在,并且如果我从reference文件夹中删除它将会中断。

有任何建议吗?

1 个答案:

答案 0 :(得分: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。

一些相关链接: