【问题标题】:How to keep dynamically loaded assemblies form breaking code at compile time?如何在编译时保持动态加载的程序集形成破坏代码?
【发布时间】:2013-08-24 12:47:40
【问题描述】:

我在运行时在我的代码中使用如下方式链接外部资源之一:

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

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

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

例如:

if (Tool.ApplicationIsOpen)
                    return StatusResult.Success;

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

有什么建议吗?

【问题讨论】:

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


    【解决方案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。

    一些相关链接:

    【讨论】:

    • 我正在尝试做一些类似于你刚才建议的事情。但问题就在这里。我试图实例化的类实例有很多成员,其中一些是来自该程序集的 Native 类型。因此,如果我在两者之间放置一个 inter ITool,那如何知道源程序集独有的数据成员类型?
    • 另一件事是,在您的示例中,“单独项目”是我们自己的项目,但在我的情况下,它是一个插件项目,我无法控制它的代码......
    • Tool 作为成员公开的程序集中的每个本机类型还需要在共享项目中有一个接口。如果你愿意,我可以做一个示例项目。您是否有权更改工具的代码?
    • public class Tool : ITool { public void Something() { // do something } } 又在哪里?
    • 您是否假设类 Tool 是他们的类,我可以将其更改为从我的界面继承?>
    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多