我正在使用以下内容在我的代码中以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文件夹中删除它将会中断。
有任何建议吗?
答案 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。
一些相关链接: