Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
2 / 2 / 1
Регистрация: 12.07.2010
Сообщений: 9

Как проверить родителя класса в DLL сборке

12.07.2010, 15:28. Показов 2724. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем так, есть:
1. DLL сборка c классом BaseElement
2. EXE-файл с самой программой, которая во время выполнения ищет DLL файлы с классами унаследованными от BaseElement

3. И в качестве бонуса отдельная DLL-ка в которой есть класс Element:BaseElement

Собственно сам вопрос, как гарантированно знать, что класс Element из DLLки унаследован от МОЕГО класса BaseElement из МОЕЙ DLL сборки, а не от какого то левого класса с таким же именем?

Единственное решение сейчас, это задать какую-нить хитрую версию для BaseElement и жестко закодиться на неё, но тогда появляются проблемы с поддержкой версий и суть проблемы не меняет, версию можно подсунуть.

Добавлено через 14 минут
Почему я так так упорно делаю акцент на стове "МОЯ/МОЕЙ сборке".
Дело в том, что проделал простой эксперимент:
1. Создал солюшн из двух DLLок: одна BaseElement, вторая Element:BaseElement -> получил "Element.DLL"
Будем НАЗЫВАТЬ этот тип BaseElement как BaseElement* чтоб не путаться (в программе он так и остался BaseElement)

2. Создал солюшн из одной сборки: BaseElement -> получил "BaseElement.DLL"

3. Создал консольный солюшен и подключил к нему "BaseElement.DLL". Помещаю в корневик "Element.DLL"

Иду по корневому каталогу программы и ищу DLLки, если нашлась, то просматриваю все типы в ней на предмет того, что тип должен быть унаследован от BaseElement.

Результат: Программа находит "Element.DLL", который унаследован от BaseElement* !!!!!!
Т.е. когда сравниваются типы, BaseElement и BaseElement* из разных сборок (т.е. по сути разные типы), .NET считает что это один и тот же тип :'(

Может у типов есть какие-то уникальные идентификаторы, которые можно сравнивать?!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.07.2010, 15:28
Ответы с готовыми решениями:

Использование dll в 64х сборке -Не удалось получить фабрику класса 80040154 Класс не зарегистрирован
Пишу приложение, работающее с FT232RL (это USB-UART мост, создающий виртуальный СОМ порт), использую стандартные библиотеки от FTDI. Помимо...

Передача управления из конструктора класса-родителя в конструктор класса-потомка
Здравствуйте. Возможно ли передать управление из конструктора класса-родителя в конструктор класса-потомка? Например, есть класс...

Инициализировать массив в сборке *.dll
Задача в следующем. В сборке (.длл) в главном классе создать и инициализировать двухмерный массив строкового типа . public string...

12
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
12.07.2010, 16:24
Очень емкий вопрос и подводных камней в нём немало. А ответ прост : Сборки Подписывать Не Забываем

Не по теме:

остальных форумчан это тоже касается

0
2 / 2 / 1
Регистрация: 12.07.2010
Сообщений: 9
12.07.2010, 16:42  [ТС]
В смысле зашифровать сборку и выложить открытый ключ для неё?
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
12.07.2010, 16:58
нет, именно "подписать сборку". в свойствах проекта на вкладке подписывание. шифровать ни чего не надо
0
2 / 2 / 1
Регистрация: 12.07.2010
Сообщений: 9
12.07.2010, 17:05  [ТС]
Properties (DLL сборки) -> Signing -> Sign the assembly -> New -> Kreate strong name key (Name: MyDllLibraryKey, Protect my keyfile with password: checked, Enter password: 123456, Confirm....)

Появляется MyDllLibraryKey.pfx, а что с ним делать то? Я ничего такого в reflection'e не видел, может подскажешь ссылку по теме или сам?
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
12.07.2010, 21:09
Делать с ним ничего не надо. Появляется не только pfx (или snk), а еще и директива подписи компилятору, строгое имя и точная идентификация сборки в ОС и GAC. Эта та самая фича среды, которая и позволяет избавиться от DLL Hell'а. На эту тему, вообще говоря, есть литература "где-то там... в интернетах..."
0
15 / 15 / 1
Регистрация: 01.07.2010
Сообщений: 33
12.07.2010, 22:20
Подписывать - это конечно правильно, но больно уж муторно. Можно попробовать при поиске класса просто указать полное имя класса вместе с namespace. Примерно вот так:
C#
1
2
3
4
5
6
7
8
9
10
                    foreach (Type type in assembly.GetTypes())
                    {
                        Type iface = type.GetInterface("BaseNamespace.SubNamespace.IBaseElement");
 
                        if (iface != null)
                        {
                            IBaseElement plugin = (IBaseElement)Activator.CreateInstance(type);
                            ...
                        }
                    }
Конечно, это не так надежно, как подпись, но в большинстве случаев этого вполне достаточно.
0
2 / 2 / 1
Регистрация: 12.07.2010
Сообщений: 9
13.07.2010, 10:37  [ТС]
В том то все и дело, что так не надежно! От родителя будет зависеть надежность работы программы, т.к. она динамически должна расширяться этими Child'ами =(
Может ты подскажешь ссылочку или может пример готовый есть?
0
15 / 15 / 1
Регистрация: 01.07.2010
Сообщений: 33
13.07.2010, 15:41
Ну добавь еще в свой базовый интерфейс (класс) специальный метод: GetSpecialCode, и пусть он возвращает, твое имя-отчество, например. Создаешь экземпляр объекта, вызываешь GetSpecialCode, вернул тебе твое имя-отчество - значит правильный объект, не вернул - значит чужой.
0
2 / 2 / 1
Регистрация: 12.07.2010
Сообщений: 9
13.07.2010, 16:19  [ТС]
Ещё раз говорю, ЭТО НЕ РЕШЕНИЕ!
Мне необходимо АБСОЛЮТНО ТОЧНО знать кто родитель класса, ибо от этого зависит надежность.
А вопрос остается актуальным:
Как сделать так, чтоб определить подмену родителя в наследнике в любом случае?
"По науке" так сказать, а Нэймспейс+Имя и Метод возвращающий код это не то.

Это как в "Защите информации": защищенность информации должна определяться только надежностью ключа. Т.е. алгоритм известен а ключ нет.

Вот и мне надо такое, чтоб не надо было бояться что кто-то увидит этот странный метод и разгадает фишку или тупо повторит нэймспэйс и имя класса родителя.
0
15 / 15 / 1
Регистрация: 01.07.2010
Сообщений: 33
13.07.2010, 16:45
Так про это тебе Mikant уже ответил. Подпиши сборку и будет тебе счастье.
0
2 / 2 / 1
Регистрация: 12.07.2010
Сообщений: 9
13.07.2010, 16:46  [ТС]
Дык знал бы я как это сделать... Гугл что-то не помог =(
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
13.07.2010, 21:50
то, что ты ответил (там где у тебя файл появился .pfx) - это и значит, что ты ее подписал (все метаданные и ссылки на файл ключей заносятся автоматически). теперь только не забудь версии сборок выставлять правильно. в файле AssemblyInfo.cs (в папке свойств проекта) последними строками идет примерное описание простого способа
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.07.2010, 21:50
Помогаю со студенческими работами здесь

Как переопределить метод родителя класса?
Есть класс TDot, который есть классом-наследником для класса TTriangle В классе TDot есть метод setColor(), который меняет цвет и метод...

Как получить доступ к переменным объекта класса-родителя?
Я знаю, что обычно передают указатель на объект класса в функцию чайлда, но вот как это сделать на ObjC никак не могу понять. ...

Вызов слота класса потомка при вызове сигнала класса родителя
Всем привет. Ситуация следующая. Есть класс родитель "class1". В нём объявлен и вызывается сигнал "signal". Есть класс...

Правда, что указатель класса-наследника не может указывать на объект класса-родителя?
Доброго времени суток! Пример кода ниже. Правда ли , что указатель класса-наследника не может указывать на объект класса-родителя? ...

Как заставить вызвать метод класса-родителя для объекта (полиморфизм)
класс BigFloat (длинные вещественные числа с учетом знака) наследуется от BigNum (целые положительные числа). Оба реализуют интерфейс Numb....


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru