Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/10: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077

interface_name ivar = (interface_name)CreateInstance...

02.06.2009, 13:26. Показов 2173. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем пытался сделать следующее:
загружаю сборку в проект:
Assembly assem Assembly.LoadFrom("..");
IClass1 icl = (IClass1)assem.CreateInstance("DLL.Class 1", true);

в общем после этого генерируется ошибка, что невозможно привести тип IClass1 к типу DLL.Class1. В билиотеке код примерно такой:
C#
1
2
3
4
5
6
7
8
9
10
11
namespace DLL
{
   interface IClass1
   {
      void GetMessage(String msg);
   }
   public class Class1: IClass1
   {
      public void GetMessage(String msg)...
   }
}
Раньше с интерфейсами работал только в делфи. Но с таким, пожалуй, не сталкивался ещё.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.06.2009, 13:26
Ответы с готовыми решениями:

Метод Activator.CreateInstance
Привет, моя архитектура приложения построена на MVVM потерне с плагинной системой и динамическими элементами. Суть моей проблемы: У меня...

Аналог Activator.Createinstance
Здравствуйте, появилась необходимость получить соединение с определенным сервером приложений через функцию Activator.Createinstance, но эта...

CreateInstance() не приводит к интерфейсу
Здравствуйте, пишу приложение... В общем ситуация: 1) Существует три проекта: - Интерфейс IPlugin - Класс, его...

10
Комбайнёр
 Аватар для MAcK
1606 / 704 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
02.06.2009, 13:59
C#
1
public interface IClass1
Так тоже ошибка?
0
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
02.06.2009, 14:17  [ТС]
Да, не работает

Добавлено через 2 минуты 36 секунд
Может есть какие-нибудь варианты с абстрактными классами? Или Partial?
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
03.06.2009, 03:26
Цитата Сообщение от Messir1987 Посмотреть сообщение
невозможно привести тип IClass1 к типу DLL.Class1
Ничего не напутали? Именно так звучит ошибка? Может в какой-то другой строке вылетает?
0
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
03.06.2009, 08:40  [ТС]
Минимизировал код. Вот он:
в этом коде ещё определён интерфейс IClass в пространстве имёт TestDLL, так, чтобы соответствовать коду из самой сборки .dll
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            try
            {
                Assembly assem = Assembly.LoadFrom("..\\..\\..\\..\\TestDLL\\TestDLL\\bin\\Release\\TestDLL.dll");
                Object o = assem.CreateInstance("TestDLL.Class1", true);
                Type t = o.GetType();
                
                t.GetMethod("GetMessage").Invoke(o, new object[] { "Hello, World" });
 
                TestDLL.IClass1 icl = (TestDLL.IClass1)Activator.CreateInstance(t);
            }
            catch (Exception except)
            {
                MessageBox.Show(except.Message, "Ошибка подключения библиотеки");
            }
сообщение GetMessage вызывается успешно... потом исключение:
"Не удалось привести тип объекта TestDLL.Class1 к типу TestDLL.IClass1"

код в библиотеке:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace TestDLL
{
    public interface IClass1
    {
        void GetMessage(String msg);
    }
    public class Class1 : IClass1
    {
        public void GetMessage(String msg)
        {
            MessageBox.Show(msg, "Сообщение из плагина");
        }
    }
}
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
03.06.2009, 09:21
А для чего вы используете один и тот же тип через прямое объяевление и тут засунуть рефлексию?
Разделите интерфейс и сам класс для него в разные библиотеки. Должно заработать.
0
Айхрень...
 Аватар для Paulie
306 / 176 / 7
Регистрация: 02.06.2009
Сообщений: 1,077
03.06.2009, 09:25  [ТС]
Цитата Сообщение от Green Посмотреть сообщение
А для чего вы используете один и тот же тип через прямое объяевление и тут засунуть рефлексию?
Разделите интерфейс и сам класс для него в разные библиотеки. Должно заработать.
Извините, не совсем понял - как разделить?
Основная задача - это динамически подключать библиотеку, т.е. её название может быть неизвестно при компиляции. А добавлять ссылку (References) не решение в данной ситуации...
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
03.06.2009, 09:30
А вот для этого
Code
1
TestDLL.IClass1 icl = (TestDLL.IClass1)Activator.CreateInstance(t);
у вас не используется ссылка на библиотеку, с интерфейсом и с классом?

Нужно создать библиотеку, в которой будет только реализация интерфейса. Эту библиотеку через References подключать и для главной программы и для классов-плагинов.
1
 Аватар для Павлик Морозов
138 / 137 / 42
Регистрация: 26.10.2012
Сообщений: 443
04.04.2013, 21:24
Цитата Сообщение от Green Посмотреть сообщение
Нужно создать библиотеку, в которой будет только реализация интерфейса. Эту библиотеку через References подключать и для главной программы и для классов-плагинов.
А можно без референсов обойтись в подобном случае? Сейчас тоже пишу программу, в которой надо динамически прилинковать группу длл, находящихся в субкаталоге относительно исполняемого файла приложения. В таких случаях референс не годится же... Загрузить сборку и вызвать из нее экземпляр класса, с этим я разобрался, но мне надо что бы из плагина передавалась инфа в платформу (параметры для запроса в БД) и плагину надо получить ответ. Как понял из материала, мне только интерфейсы помогут, но ситуация с референсами несколько напрягает.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
04.04.2013, 22:07
Цитата Сообщение от Павлик Морозов Посмотреть сообщение
но ситуация с референсами несколько напрягает.
Референсы нужны для того, чтобы Jitter динамически загружал нужную сборку во время работы приложения, когда вы используете рефлексию, то вы сами загружаете сборку; референсы тут вообще никаким боком.

Цитата Сообщение от Павлик Морозов Посмотреть сообщение
из плагина передавалась инфа в платформу
Плагин, не плагин, какая разница, , код исполняется в текущем приложении-
выполняете методы, получаете результаты, et cetera
0
 Аватар для Павлик Морозов
138 / 137 / 42
Регистрация: 26.10.2012
Сообщений: 443
05.04.2013, 19:04
IamRain, вот в этом и проблема... Я не пойму каким образом мне надо обратиться из плагина к методу, расположенному в платформе. Пример :

Код платформы (Главная форма приложения):
C#
1
2
3
4
5
6
7
8
9
10
11
private void MainForm_Load(object sender, EventArgs e)
{
    Assembly plugin = Assembly.LoadFile("C:\\MyProgramm\\Plugins\\Plugin.dll");
}
 
private void Button_Click(object sender, EventArgs e)
{
    Type FrmType = plugin.GetType("plugin.PluginForm");
    Form frm = (Form)Activator.CreateInstance(FrmType);
    frm.ShowDialog();
}
Т.е. после нажатия кнопки я получил экземпляр класса из плагина Plugin.dll. Его код:

C#
1
2
3
4
5
6
7
8
9
10
public class PluginForm
{
    private void Form_Load(object sender, EventArgs e)
        {
              string "Select NAME from NameTable where CODE = 15";
              //Как эту переменную отправить в класс SQLWork (см.ниже)?? Не пойму
 
              TextBox.Text = "Возвращенное из класса SQLWork строковое значение"
        }
}
так же в платформе есть класс для работы с БД (назовем его SQLWork):
C#
1
2
3
4
5
6
7
8
9
10
public class SQLWork
{
    publick string ExecuteCommand(string Query)
        {
              Sqlcommand Command = new Sqlcommand(Query, Connection);
              Command.ExecuteReader();
              //получаем строковое значение
              return <возвращаем полученное строковое значение>
         }
}
На этом я и застрял. Пробовал разобраться с интерфейсами, но уперся в разные неймспейсы... Из платформы достучаться в метод плагина и даже получить оттуда значение я могу. А вот что бы плагином достучаться до метода, расположенного в классе платформы, передать значение, да еще и получить ответ не получается...

P.S. Если я правильно понимаю, то мне надо при работе плагина создать экземпляр класса SQLWork, что бы получить доступ к его методам...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2013, 19:04
Помогаю со студенческими работами здесь

Ошибка Activator.CreateInstance
Добрый день! Пытаюсь создать экземпляр объект типа переданного параметром и еще при компиляции получаю ошибку как скриншоте. Подскажите...

Почему System.Activator.CreateInstance<T>() позволяет создавать объект в любом случае?
Почему System.Activator.CreateInstance&lt;T&gt;() позволяет создавать объект класс в любом случае? Точнее, даже в том, если в типе нет...

@property или ivar
Добрый день! Занимаюсь Objective C недавно, и, до сегодняшнего времени, не задавался вышеупомянутым вопросом. В учебниках и статьях...

Что за знак подчеркивания перед именем ivar-а?
заметил, что в XCODE 5 программа автоматически пытается постаивть знак &quot;_&quot;: _lbl.text=tittle; Что он значит? Файл h: #import...

Exception при получение COM-объекта через Activator.CreateInstance(). Как "отладить"?
Доброго всем дня. Возникла проблема с получением COM-объекта через Activator.CreateInstance(T). В частности, использую следующий код: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru