我写了一个插件程序。
PlugIn.dll:
namespace PlugIn
{
public interface IPlugIn
{
void RunTask();
}
public static IPlugIn CreateInstanceFromAssembly(string assemblyFullName)
{
Assembly assembly = Assembly.LoadFile(assemblyFullName);
Type[] types = assembly.GetExportedTypes();
IPlugIn plugin = null;
if (types.Length > 0)
{
plugin = assembly.CreateInstance(types.FirstOrDefault().ToString()) as IPlugIn;
}
if (plugin == null)
throw new Exception("No available plug-in found in the plug-in:" + assemblyFullName);
return plugin;
}
}
PlugIn1.dll:
namespace PlugIn1
{
public class PlugIn1 : IPlugIn
{
void RunTask()
{
//PlugIn1 tasks...
}
}
}
此外,PlugIn1.dll引用另一个由我创建的dll,例如MyLib.dll。 PlugIn.dll和MyLib.dll与PlugIn1.dll都位于同一目录
我的测试程序
static void Main(string[] args)
{
string pluginFullName = "c:\\somewhere\\PlugIn1.DLL";
IPlugIn plugin = PlugIn.CreateInstanceFromAssembly(pluginFullName);
plugin.RunTask();
}
我可以看到,PlugIn.CreateInstanceFromAssembly成功运行,并返回了一个实例。但是,当我运行plugin.RunTask()时,出现了以下错误: 无法加载文件或程序集'MyLib,版本= 1.0.0.0,文化=中性,PublicKeyToken =空'或其依赖项之一。系统找不到指定的文件。
PlugIn.dll,PlugIn1.dll和MyLib.dll都不是强命名。
问题: 1.如果Assembly.LoadFile和CreateInstance必须使用强名称,为什么在调用该接口之前,我可以成功做到这一点(没有对我的所有程序集使用强名称)?为什么在调用接口之前会出错?
2。归档目标的正确方法是什么?我必须对程序集进行强命名吗?如果答案为“是”,则哪个dll需要被强命名?