Ваша проблема заключается в включении нессылочной библиотеки, хотя в вашем случае, когда вы пытаетесь динамически загрузить библиотеку, решение состоит в том, чтобы удалить директиву использования.
Чтобы правильно управлять плагинами, вы должны предоставить общий API в виде библиотеки. API должен предоставлять интерфейсы и классы, достаточно абстрактные, чтобы их мог использовать любой подключаемый модуль для правильной регистрации. Они должны раскрывать достаточно для выполнения действий, которые вы ожидаете или разрешаете (например, изменение интерфейса, добавление способа обработки определенных типов контента), но не должны раскрывать большое количество внутренней работы или защищенной информации.
Существует два способа определения плагина: они могут быть .exe или .dll.
Если вы определите их как .exe, вы можете заставить их принимать классы, определенные в API плагина, которые они затем используют для регистрации. Пример:
Основная программа:
void LoadPlugin(string fullPath)
{
Assembly assembly = Assembly.FromFile(fullPath);
//class that provides methods for registering plugins
IPluginRegistrationService registration = new PluginRegistrationService();
assembly.EntryPoint.Invoke(null,new object[] { registration });
}
Плагин:
static void main(IPluginRegistrationService registration)
{
//do registration work
//for example:
//registration.RegisterUIPlugin(new UIPluginInfo("plugin name"));
}
Если вы определяете их как .dll, программа сама должна искать и создавать экземпляры классов, которые реализуют интерфейс/класс, определяющий запись плагина. Пример:
ОсновнаяПрограмма:
void LoadPlugin(string fullPath)
{
Assembly assembly = Assembly.LoadFile(file);
foreach (Module module in assembly.GetModules())
{
foreach (Type type in module.GetTypes())
{
if (type.IsSubclassOf(typeof(IPlugin)))
{
//poll constructors and instantiate type
//do work to load plugin based on values
}
}
}
}
Плагин:
public class CarPlugin : IPlugin
{
//implement IPlugin members to expose
//information such as name
}
person
Pharap
schedule
17.11.2013