Я пишу плагин программы.
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