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);”。我想知道为什么框架不知道如何在插件本身中解决它。