示例控制台程序。
class Program { static void Main(string[] args) { // ... code to build dll ... not written yet ... Assembly assembly = Assembly.LoadFile(@"C:\dyn.dll"); // don't know what or how to cast here // looking for a better way to do next 3 lines IRunnable r = assembly.CreateInstance("TestRunner"); if (r == null) throw new Exception("broke"); r.Run(); } }
我想动态生成一个程序集(.dll),然后加载该程序集,实例化一个类,然后调用该类的Run()方法。我应该尝试将TestRunner类转换为某些东西吗?不知道一个程序集(动态代码)中的类型如何知道我的(静态程序集/ shell应用程序)中的类型。仅使用几行反射代码在一个对象上调用Run()更好吗?该代码应该是什么样的?
更新:威廉·埃德蒙森-见评论
首先将组件加载到其自身中会更安全,更灵活AppDomain。
AppDomain
因此,而不是先前给出的答案:
var asm = Assembly.LoadFile(@"C:\myDll.dll"); var type = asm.GetType("TestRunner"); var runnable = Activator.CreateInstance(type) as IRunnable; if (runnable == null) throw new Exception("broke"); runnable.Run();
我建议以下内容(根据此答案适应相关问题):
var domain = AppDomain.CreateDomain("NewDomainName"); var t = typeof(TypeIWantToLoad); var runnable = domain.CreateInstanceFromAndUnwrap(@"C:\myDll.dll", t.Name) as IRunnable; if (runnable == null) throw new Exception("broke"); runnable.Run();
现在,您可以卸载装配并具有不同的安全设置。
如果您想要更大的灵活性和功能来动态加载和卸载程序集,则应查看托管加载项框架(即System.AddIn名称空间)。有关更多信息,请参见MSDN上有关加载项和可扩展性的文章。
System.AddIn