Assembly.LoadFile и CreateInstance ... Является ли StrongName обязательным? - PullRequest
0 голосов
/ 03 мая 2019

Я пишу плагин программы.

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, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null' или одну из ее зависимостей. Система не может найти указанный файл.

Ни один из PlugIn.dll, PlugIn1.dll и MyLib.dll не имеет строгого имени.

Вопрос: 1. Если строгое имя является обязательным для Assembly.LoadFile и CreateInstance, почему я могу успешно сделать это (без строгого имени для всех моих сборок) перед вызовом интерфейса? Почему я получаю сообщение об ошибке до вызова интерфейса?

2. Как правильно архивировать мою цель? Должен ли я назвать свою сборку строго? Если ответ «ДА», то какой из dll должен быть строго назван?

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