一尘不染

正确的方式来加载程序集,查找类并调用Run()方法

c#

示例控制台程序。

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()更好吗?该代码应该是什么样的?

更新:威廉·埃德蒙森-见评论


阅读 190

收藏
2020-05-19

共1个答案

一尘不染

使用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上有关加载项和可扩展性的文章。

2020-05-19