假设我有一个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 的程序集了吗?
答案 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
如果找不到依赖关系,那么它将出现在日志中。
如果没有,它将为您提供有关抛出异常原因的更详细信息。