为什么Activator.CreateInstance()在动态加载的程序集中失败?

时间:2015-02-23 22:52:51

标签: c# .net assemblies appdomain

假设我有一个Host / Plugin场景:

主机:

static void Main(string[] args)
{
    var path = @"D:\Plugin.dll";
    var assembly = Assembly.LoadFile(path);
    var type = assembly.GetType("Plugin.K");
    var method = type.GetMethod("Run");
    var instance = Activator.CreateInstance(type);

    method.Invoke(instance, new object[] {});
}

插件:

public class K {
    public void Run() {
        // EXCEPTION THROWN HERE:
        var x = Activator.CreateInstance("Plugin", "Plugin.K");
    }
}

那么为什么抛出以下异常?

An exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll but was not handled in user code

Additional information: Could not load file or assembly 'Plugin' or one of its dependencies. The system cannot find the file specified.

已经加载 AppDomain 的程序集了吗?

3 个答案:

答案 0 :(得分:1)

MSDN

  

Assembly类的LoadFrom方法在给定文件位置的情况下加载程序集。使用此方法加载程序集使用不同的加载上下文。

     

推荐的方法是使用System.Reflection.Assembly类的静态(Visual Basic中的Shared)Load方法。

有关其他选项,请参阅上述链接。

答案 1 :(得分:1)

appdomain已经加载了程序集。

在我查看Activator.CreateInstance的源代码之后 我找到了一个解决方案:

public class K
{


    public void Run()
    {

        //var f1 = Assembly.GetAssembly(typeof (K)).CreateInstance("Plugin.K");
        //var f2 = Assembly.GetExecutingAssembly().CreateInstance("Plugin.K");
        //var f3 = Activator.CreateInstance(typeof(K));

        //won't throw exception
        var x = Activator.CreateInstance(null, "Plugin.K");

    }
}

问题出在activator.createinstance中,当激活器尝试加载程序集名称然后加载程序集时。

当您将null作为程序集名称传递时,激活器将使用:

  assembly = RuntimeAssembly.GetExecutingAssembly(ref stackMark);

注意:示例f1-3也有效。

答案 2 :(得分:0)

要调试本次启用.net

中的Fusion登录

How to enable assembly bind failure logging (Fusion) in .NET

如果找不到依赖关系,那么它将出现在日志中。

如果没有,它将为您提供有关抛出异常原因的更详细信息。