|
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
|
|
| 12.07.2010, 15:28 | |
|
Ответы с готовыми решениями:
12
Использование dll в 64х сборке -Не удалось получить фабрику класса 80040154 Класс не зарегистрирован Передача управления из конструктора класса-родителя в конструктор класса-потомка Инициализировать массив в сборке *.dll |
|
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
|
|
|
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
|
|
|
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. Примерно вот так:
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
|
|
|
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
|
|
| 13.07.2010, 21:50 | |
|
то, что ты ответил (там где у тебя файл появился .pfx) - это и значит, что ты ее подписал (все метаданные и ссылки на файл ключей заносятся автоматически). теперь только не забудь версии сборок выставлять правильно. в файле AssemblyInfo.cs (в папке свойств проекта) последними строками идет примерное описание простого способа
0
|
|
| 13.07.2010, 21:50 | |
|
Помогаю со студенческими работами здесь
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 и. . .
|