Вопрос по c# – Приложение на основе плагинов в C #

9

Я должен сделать приложение с графическим пользовательским интерфейсом, используя язык по своему выбору. Приложение будет работать на Windows XP. Это будет своего рода сложное приложение для Windows. Я думаю, и в соответствии с большинством предложений, C # будет лучшим для использования. Древовидная структура слева от графического интерфейса будет заполняться после чтения из файла конфигурации, который будет двоичным файлом. (но изначально я могу работать с простым файлом ASCII, чтобы проверить мой код.). Приложение примет некоторые входные данные от пользователя через этот графический интерфейс и запишет обратно в тот же файл конфигурации и отразит изменения в древовидной структуре или метках или любом другом соответствующем поле формы.

Для каждой из вкладок будет 3 вкладки и 3 соответствующих файла конфигурации. Мне нужна помощь в разработке приложения на данный момент. Я планирую сделать хост-приложение (основное приложение) и использовать 3 вкладки в качестве плагинов. Это работоспособно? Если да, можете ли вы, пожалуйста, направить меня в этом. Я имею в виду, как мне сделать 3 плагина в C # и как написать интерфейс, чтобы основное приложение знало, какой плагин загрузить и когда его загрузить? Будет ли отдельный & # x201C; Плагин & # x201D; папка в папке моего проекта? Я надеюсь, что вы поняли мою точку зрения, хотя для вас это слишком мало информации.

Также есть некоторые файлы .cpp, уже существующие в проекте. Эти файлы вместе с некоторыми файлами .h содержат некоторые важные определения и константы. Они должны быть интегрированы с моим приложением C #. Я понятия не имею, как это сделать, но я уверен, что это возможно, скомпилировав код .cpp в .dll, а затем предоставив скомпилированный .dll моему приложению C #. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация для дизайна верхнего уровня.

Спасибо, Viren

"Я должен сделать приложение с графическим интерфейсом пользователя" Имейте смелость сказать «Нет» ima
я тебя не понял? zack

Ваш Ответ

5   ответов
1
Error: User Rate Limit Exceeded zack
3

http://msdn.microsoft.com/en-us/library/system.addin.aspx

В противном случае вы можете сделать все сами. До того, как это пространство имен стало доступно, я использовал общий интерфейс «IPlugin». что каждый плагин / надстройка необходимо использовать. Затем у меня был загрузчик, который проверял все * .dll в папке, а затем использовал отражение для проверки интерфейса. Затем я мог бы создавать экземпляры классов, в которых реализован мой интерфейс плагин / надстройка

Файлы cpp, вероятно, потребуется конвертировать в c #, или вы можете создать dll для ссылки.

8

которую я когда-либо использовал, была, конечно,Структура управляемой расширяемости который будет частью .NET 4 (afaik). К сожалению, он еще не закончен, и доступен только предварительный просмотр, который может отличаться от финальной версии. При этом мы использовали MEF Preview 3 для универсального проекта, и он работал без проблем, и это, безусловно, значительно облегчило работу всего плагина.

Error: User Rate Limit Exceeded
13

вам понадобится такой метод. Я оставил некоторые TODO там, где вы хотели бы улучшить обработку ошибок и / или сделать реализацию немного более специфичной для конкретного случая.

    public List<T> LoadPlugin<T>(string directory)
    {
        Type interfaceType = typeof(T);
        List<T> implementations = new List<T>();

        //TODO: perform checks to ensure type is valid

        foreach (var file in System.IO.Directory.GetFiles(directory))
        {
            //TODO: add proper file handling here and limit files to check
            //try/catch added in place of ensure files are not .dll
            try
            {
                foreach (var type in System.Reflection.Assembly.LoadFile(file).GetTypes())
                {
                    if (interfaceType.IsAssignableFrom(type) && interfaceType != type)
                    { 
                        //found class that implements interface
                        //TODO: perform additional checks to ensure any
                        //requirements not specified in interface
                        //ex: ensure type is a class, check for default constructor, etc
                        T instance = (T)Activator.CreateInstance(type);
                        implementations.Add(instance);
                    }
                }
            }
            catch { }
        }

        return implementations;
    }

Пример для звонка:

List<IPlugin> plugins = LoadPlugin<IPlugin>(path);

Что касается c ++ части вашего вопроса. Есть несколько разных способов подойти к этому, хотя правильный выбор зависит от вашей конкретной ситуации. Вы можете создать CLR-совместимый .dll в c ++, на который ваш c # проект мог бы ссылаться и вызывать, как и любой другой .dll, на который он ссылается. Кроме того, вы можете использоватьP / Invoke позвонить в родной .dll.

Error: User Rate Limit Exceeded zack
Error: User Rate Limit Exceeded
0

.. Увидетьhttp://blog.caljacobson.com/2007/07/26/creating-a-plug-in-framework-in-c-resources/ для списка примеров плагинов, использующих эту технику.

Похожие вопросы