Лучший способ создать подкласс шаблона объекта в dll плагина?

у меня 4 класса; A, B, C и D

Я хочу загружать эти классы динамически на основе некоторого критерия

Эти классы находятся в собственном проекте библиотеки классов C# (dll). Эти классы используют Helix3D Toolkit.

  1. Как я могу разработать систему плагинов, которая считывает все файлы .dll в папке плагинов и позволяет их как-то помечать или нумеровать (может ли это сделать статическое значение?) для вызова при необходимости?

  2. Если я ссылаюсь на класс A в dll, в то время как класс A находится в основном проекте, будет ли dll в папке плагинов автоматически находить класс A, подклассы класса плагина при динамической загрузке в основное приложение?


person JasonX    schedule 03.04.2014    source источник
comment
Спасибо, Сэм, за правку, но ты как бы упустил суть моего вопроса. У меня есть шаблоны классов A, B, C и D, которые я хочу создать в своих плагинах. И эти классы находятся НЕ в их собственном dll-проекте, а в основном exe-проекте, поскольку они ломаются, если их перемещать в отдельный проект (в статике спирали Overlay.SetCoordinate3D есть ошибка).   -  person JasonX    schedule 03.04.2014
comment
Они не должны сломаться, если вы переместите их в свою собственную сборку, вы ссылаетесь на dll-файлы спирали в сборке, в которую вы их перемещаете? Кроме того, определите разрыв.   -  person Sam Leach    schedule 03.04.2014
comment
Верно, извините за это. Overlay.SetCooridnates3D(Vector3f position) устанавливает координаты дочернего элемента холста относительно базового Helix3DViewport - подкласса окна просмотра WPF3D, я думаю. Как делается это волшебство, я понятия не имею, но оно отлично работает, если класс находится в основном проекте. После перемещения в отдельный проект и ссылки на него тот же класс устанавливает координаты холста равными 0,0, независимо от входных данных Vector3. И да, Helix3Dtoolkit упоминается в обоих проектах. Я предполагаю, что это как-то связано с доступом к Helix3DViewport, но это всего лишь предположение.   -  person JasonX    schedule 03.04.2014
comment
Добавив сюда информацию, если базовый класс находится в основном проекте и является подклассом в отдельном проекте, оверлей все еще работает. Только когда базовый класс перемещается, оверлей действует.   -  person JasonX    schedule 03.04.2014


Ответы (1)


Я отредактировал ваш вопрос, потому что он слишком длинный и многословный (3000 символов).

Ответ на вопрос 1

Чтобы динамически загружать DLL, посмотрите этот ответ. Он использует отражение для перебора каждого типа в сборке и использует Activator.CreateInstance() для создания экземпляров классов.

Для вашей системы плагинов я бы создал что-то вроде:

В вашем .exe:

public interface IPlugin
{
    void DoSomething();
}

public class A : IPlugin
{
    public virtual void DoSomething() {}
}

public class B : IPlugin
{
    public virtual void DoSomething() {}
}

public class C : IPlugin
{
    public virtual void DoSomething() {}
}

public class D : IPlugin
{
    public virtual void DoSomething() {}
}

В библиотеке DLL:

public class NewA : A
{
    public override void DoSomething() { base.DoSomething() }
}

public class NewB : B
{
    public override void DoSomething() { base.DoSomething() }
}

public class NewC : C
{
    public override void DoSomething() { base.DoSomething() }
}

public class NewD : D
{
    public override void DoSomething() { base.DoSomething() }
}

В своем клиентском коде код против IPlugin. Ваш клиентский код не знает о конкретных классах A, B, C, D.

Загрузите нужные классы из имеющихся у вас DLL и вставьте их в IPlugin

Ответ на вопрос 2

У вас могут быть классы с одним и тем же именем класса, если они находятся в разных пространствах имен, вы не можете иметь классы с одним и тем же именем в одном и том же пространстве имен. В вашем случае они должны быть в разных пространствах имен, так что все в порядке.

person Sam Leach    schedule 03.04.2014
comment
Ясно, уберите текущие шаблоны в основном приложении и замените их на IPlugin. Но классы A, B, C и D ОГРОМНЫ, каждый из них ссылается на несколько библиотек. Если планируется несколько сотен, размер будет гигантским (относительно). Нет ли способа использовать только sublass и расширить метод в плагине? Изменить: неважно, я неправильно понял ваш ответ. - person JasonX; 03.04.2014