Assembly.LoadFile和CreateInstance ... StrongName是必须的吗?

时间:2019-05-03 15:03:34

标签: c# .net-assembly strongname

我写了一个插件程序。

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需要被强命名?

  • PlugIn.dll
  • PlugIn1.dll
  • MyLib.dll

0 个答案:

没有答案