Как в C# при написании интерфейса для плагина описать своиства или методы для доступа к родительским объектам?
Т.е. у меня есть некое ядро, в котором есть объекты или функции и я хочу в плагинах ими пользоваться.
Здравствуйте, godwizard, Вы писали:
G>Как в C# при написании интерфейса для плагина описать своиства или методы для доступа к родительским объектам? G>Т.е. у меня есть некое ядро, в котором есть объекты или функции и я хочу в плагинах ими пользоваться.
В C++ есть __super keyword. У C# этого нет... =(
Как вариант можно передавать указатель на родителя при инициализации плагина.
Здравствуйте, TSS, Вы писали:
TSS>Здравствуйте, godwizard, Вы писали:
G>>Как в C# при написании интерфейса для плагина описать своиства или методы для доступа к родительским объектам? G>>Т.е. у меня есть некое ядро, в котором есть объекты или функции и я хочу в плагинах ими пользоваться.
TSS>В C++ есть __super keyword. У C# этого нет... =( TSS>Как вариант можно передавать указатель на родителя при инициализации плагина.
Это типа methodeName(Parent prnt);? Или как в интерфейсе указатель на родителя передать?
Здравствуйте, godwizard, Вы писали:
G>Как в C# при написании интерфейса для плагина описать своиства или методы для доступа к родительским объектам?
Ну ничего не понял. Кто такие интерфейсы и при чем тут плагины?
G>Т.е. у меня есть некое ядро, в котором есть объекты или функции и я хочу в плагинах ими пользоваться.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, godwizard, Вы писали:
G>>Как в C# при написании интерфейса для плагина описать своиства или методы для доступа к родительским объектам?
AVK>Ну ничего не понял. Кто такие интерфейсы и при чем тут плагины?
G>>Т.е. у меня есть некое ядро, в котором есть объекты или функции и я хочу в плагинах ими пользоваться.
AVK>Ну так пользуйся.
Я тут примерчик по плагинам прочитал (RSDN Magasine #1) там написано, что можно написать интерфейс для плагина, потом писать плагины, имплементируя интерфейс. Я так и начал делать. Но у меня в основной программе у меня есть объекты, котрые хочется использовать в плагинах.
Здравствуйте, godwizard, Вы писали:
G>Я тут примерчик по плагинам прочитал (RSDN Magasine #1)
По моему я писал.
G> там написано, что можно написать интерфейс для плагина, потом писать плагины, имплементируя интерфейс.
Ну да.
G>Я так и начал делать. Но у меня в основной программе у меня есть объекты, котрые хочется использовать в плагинах.
Вынеси эти объекты (или их интерфейсы) в отдельную сборку и сделай на них референс. Теоретически можно сделать референс прямо на ехе-шник, но студия на это ругается.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, godwizard, Вы писали:
G>>Я тут примерчик по плагинам прочитал (RSDN Magasine #1)
AVK>По моему я писал.
G>> там написано, что можно написать интерфейс для плагина, потом писать плагины, имплементируя интерфейс.
AVK>Ну да.
G>>Я так и начал делать. Но у меня в основной программе у меня есть объекты, котрые хочется использовать в плагинах.
AVK>Вынеси эти объекты (или их интерфейсы) в отдельную сборку и сделай на них референс. Теоретически можно сделать референс прямо на ехе-шник, но студия на это ругается.
А как ты плагины создаешь? Я имею ввиду какой тип Проекта ты выбираешь, Class Library?
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, godwizard, Вы писали:
G>>А как ты плагины создаешь? Я имею ввиду какой тип Проекта ты выбираешь, Class Library?
AVK>Конечно
AVK>
Вот еще тогда такой вопрос. Я плагины хочу перебирать добавлять в меню. У меня MDI приложение и плагины — это дочерние окна. Я в интерфейсе указываю метод выбора пункта меню и в плагине я должен указать MdiParent. Как мне родителя передать? Exe-шник основной референсить?
Здравствуйте, godwizard, Вы писали:
G>Вот еще тогда такой вопрос. Я плагины хочу перебирать добавлять в меню. У меня MDI приложение и плагины — это дочерние окна. Я в интерфейсе указываю метод выбора пункта меню и в плагине я должен указать MdiParent. Как мне родителя передать? Exe-шник основной референсить?
Придумать для родителя интерфейс и вынести в другую сборку
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, godwizard, Вы писали:
G>>Вот еще тогда такой вопрос. Я плагины хочу перебирать добавлять в меню. У меня MDI приложение и плагины — это дочерние окна. Я в интерфейсе указываю метод выбора пункта меню и в плагине я должен указать MdiParent. Как мне родителя передать? Exe-шник основной референсить?
AVK>Придумать для родителя интерфейс и вынести в другую сборку
Я тут проблемку эту решил, но вылезла новая : делаю все по примеру, описанному в журнале, но во-первых,
if(typeof(IPluginModule).IsAssignableFrom(t))
почему то игнорирует мой тип, во-вторых, когда я его закоментировал, он мне стал ругаться на
An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll
Additional information: Constructor on type Proman.IPluginModule not found.
G>An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll
G>Additional information: Constructor on type Proman.IPluginModule not found.
G>
Видимо у тебя нет конструктора без параметров. А MissingMethodException обычно вылазит если сборки не перекомпилировать. Сделай в студии Rebuild solution.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, godwizard, Вы писали:
G>>Я тут проблемку эту решил, но вылезла новая : делаю все по примеру, описанному в журнале, но во-первых, G>>
if(typeof(IPluginModule).IsAssignableFrom(t))
почему то игнорирует мой тип, во-вторых, когда я его закоментировал, он мне стал ругаться на
G>>An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll
G>>Additional information: Constructor on type Proman.IPluginModule not found.
G>>
AVK>Видимо у тебя нет конструктора без параметров. А MissingMethodException обычно вылазит если сборки не перекомпилировать. Сделай в студии Rebuild solution.
Есть конструктор без параметров. Может в плагине чего прописать?
Здравствуйте, DarkGray, Вы писали:
DG>Здравствуйте, godwizard, Вы писали:
G>>Есть конструктор без параметров. Может в плагине чего прописать?
DG>А конструктор объявлен как public?
public class fProExplorer : Form, IPluginModule
{
/// <summary>
/// Required designer variable.
/// </summary>
private Container components = null;
public fProExplorer()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
....
DG>Во время ошибки t.FullName == "Proman.IPluginModule", Так?
DG>Тогда все понятно: ты пытаешь создать объект типа интерфейс...
DG>Интерфейс надо пропускать.
DG>
Здравствуйте, DarkGray, Вы писали:
DG>Здравствуйте, godwizard, Вы писали:
G>>В смысле пропускать?
DG>Такое ощущение, что ты перебираешь типы из своей assembly, а не из той где у тебя лежит plugin.
DG>При этом ты при перебирании находишь интерфейс IPluginModule и пытаешь создать объект с типом IPluginModule. Ясно что у тебя ничего не получается.
DG>ps DG> Если у тебя все-таки просто лежат interface и сам plugin в одной ассембли (Да и вообще на будущее), то просто сделай так:
DG>
G>>и в дебаге вижу что t = Proman.IPluginModule, почему то игнорируется
DG>Интерфейс как раз и должен игнорироваться, должны находится только классы, которые реализовывают этот интерфейс.
DG>Почему у тебя не находятся классы? — Имхо, потому что ты ищешь их не в той сборке.
Дык я просто папку с длл-ками сканирую и подключаю в цикле. При чем тут сборка?
Здравствуйте, DarkGray, Вы писали:
G>>Дык я просто папку с длл-ками сканирую и подключаю в цикле. При чем тут сборка?
DG>папка-то правильная?
DG>
да. и длл-ку находит, т.е. я все шаги в дебаге просматриваю. и когда доходит до создания объекта, тут то все накрывается. Ругается, что конструктор на IPluginModule не найден В интерфесе же не надо никаких конструкторов прописывать.
Здравствуйте, godwizard, Вы писали:
G>Здравствуйте, DarkGray, Вы писали:
G>>>Дык я просто папку с длл-ками сканирую и подключаю в цикле. При чем тут сборка?
DG>>папка-то правильная?
DG>>
G>да. и длл-ку находит, т.е. я все шаги в дебаге просматриваю. и когда доходит до создания объекта, тут то все накрывается. Ругается, что конструктор на IPluginModule не найден В интерфесе же не надо никаких конструкторов прописывать.
Здравствуйте, MaxMP, Вы писали:
MMP>Здравствуйте, godwizard, Вы писали:
G>>Здравствуйте, DarkGray, Вы писали:
G>>>>Дык я просто папку с длл-ками сканирую и подключаю в цикле. При чем тут сборка?
DG>>>папка-то правильная?
DG>>>
G>>да. и длл-ку находит, т.е. я все шаги в дебаге просматриваю. и когда доходит до создания объекта, тут то все накрывается. Ругается, что конструктор на IPluginModule не найден В интерфесе же не надо никаких конструкторов прописывать.
MMP>А зачем ты интерфес пытаешься создать?
Здравствуйте, godwizard, Вы писали:
MMP>>А зачем ты интерфес пытаешься создать?
G>Есть другое предложение?
Экземпляр интерфейса не создается, через него можно подергать объект за заранее известные методы, а создаются экземпляры классов, которые реализуют этот интерфейс
Здравствуйте, kreek, Вы писали:
K>Здравствуйте, godwizard, Вы писали:
MMP>>>А зачем ты интерфес пытаешься создать?
G>>Есть другое предложение?
K>Экземпляр интерфейса не создается, через него можно подергать объект за заранее известные методы, а создаются экземпляры классов, которые реализуют этот интерфейс
Может я чего то недопонимаю? Я создал интерфейс, создал класс, имплементирующий данный интерфейс, скомпилировл длл, далее в программе загружаю длл и хочу создать объект этого класса: MyInterface myObject = (MyInterface)asm.CreateInstance(t.FullName);
Или чего то не так?
Здравствуйте, godwizard, Вы писали:
G>Может я чего то недопонимаю? Я создал интерфейс, создал класс, имплементирующий данный интерфейс, скомпилировл длл, далее в программе загружаю длл и хочу создать объект этого класса: MyInterface myObject = (MyInterface)asm.CreateInstance(t.FullName); G>Или чего то не так?
Я не про конкретную задачу, с которой у тебя проблема. А что вообще возвращает asm.CreateInstance(t.FullName)
Здравствуйте, kreek, Вы писали:
K>Здравствуйте, godwizard, Вы писали:
G>>Может я чего то недопонимаю? Я создал интерфейс, создал класс, имплементирующий данный интерфейс, скомпилировл длл, далее в программе загружаю длл и хочу создать объект этого класса: MyInterface myObject = (MyInterface)asm.CreateInstance(t.FullName); G>>Или чего то не так?
K>Я не про конкретную задачу, с которой у тебя проблема. А что вообще возвращает asm.CreateInstance(t.FullName)
Попробовал даже так написать
Object pm = asm.CreateInstance(t.FullName);
выдала вот такой Exception:
[c#]
An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll
Additional information: Constructor on type Proman.IPluginModule not found.
[c#]
Здравствуйте, godwizard, Вы писали:
G>Попробовал даже так написать
Object pm = asm.CreateInstance(t.FullName);
G>выдала вот такой Exception: G>[c#] G>An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll
G>Additional information: Constructor on type Proman.IPluginModule not found. G>[c#]
У тебя скорее всего t.FullName == Proman.IPluginModule, а надо указать класс, который имплементирует этот интерфейс.
Здравствуйте, kreek, Вы писали:
K>Здравствуйте, godwizard, Вы писали:
G>>Попробовал даже так написать
Object pm = asm.CreateInstance(t.FullName);
G>>выдала вот такой Exception: G>>[c#] G>>An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll
G>>Additional information: Constructor on type Proman.IPluginModule not found. G>>[c#]
K>У тебя скорее всего t.FullName == Proman.IPluginModule, а надо указать класс, который имплементирует этот интерфейс.
Извини, я просто не знаю как это писать, если подскажешь, буду благодарен.
Здравствуйте, kreek, Вы писали:
K>Здравствуйте, godwizard, Вы писали:
G>>Извини, я просто не знаю как это писать, если подскажешь, буду благодарен.
K>Кидай сырцы.
K>>У тебя скорее всего t.FullName == Proman.IPluginModule, а надо указать класс, который имплементирует этот интерфейс.
G>Извини, я просто не знаю как это писать, если подскажешь, буду благодарен.
Откуда-то ты это t же берешь? И это t у тебя есть тип интерфейса, а должен быть тип класса, рефлизующего интерфейс!
Так ведь у тебя в сборке ProExplorer.dll объевлен интерфейс IPluginModule и класс имплементирующий его fProExplorer, а клиент имеет свой интерфейс IPluginModule, т.е. получается, что у тебя 2 интерфейса IPluginModule, но fProExplorer реализует тот интерфейс, который объевлен в сборке плагина, поэтому и невозможно сделать приведение типа на клиенте.
Я не знаю откуда ты брал пример, но делать надо не так, т.е. общий интерфейс выносить в отдельную сборку и цеплять ее в сборку плагина и к клиенту, в сборке плагина реализовывать в классах, а на клиенте приводить к этому типу, тогда не будет проблем Invalid cast exception.
Удачи.
G>>>Вот еще тогда такой вопрос. Я плагины хочу перебирать добавлять в меню. У меня MDI приложение и плагины — это дочерние окна. Я в интерфейсе указываю метод выбора пункта меню и в плагине я должен указать MdiParent. Как мне родителя передать? Exe-шник основной референсить?
G>Я тут проблемку эту решил...
Извините за вопрос на вопрос, но все-таки, как вы решили эту проблемку? Заранее спасибо за помощь.