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

C# 为什么Activator.CreateInstance()在动态加载的程序集中失败?,c#,.net,assemblies,appdomain,C#,.net,Assemblies,Appdomain,假设我有一个主机/插件场景: 主机: 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.Create

假设我有一个主机/插件场景:

主机:

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");
    }
}
插件:

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中?

若要调试此程序集,请打开.net中的Fusion登录

如果找不到依赖项,则该依赖项将出现在日志中

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

Per:

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

建议使用System.Reflection.Assembly类的静态(在Visual Basic中共享)加载方法


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

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也适用。

可能是路径问题?插件驻留在何处?看起来非常相似,或者重复了Never use LoadFile(),always LoadFrom()。@MichaelTodd主机知道插件的路径,因为它称之为“var assembly=assembly.LoadFile(path);”。我想知道为什么框架不知道如何在插件本身中解决它。