Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> явное подключение dll, используя только код 
V
    Опции темы
Azzdorf
  Дата 12.12.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.3.2007

Репутация: нет
Всего: нет



новичковій вопрос , но искал и найти немогу и все: smile  smile 

вообщем назрело - насобирал кучу методов которые мона пихать в отдельные бибилиотеки и использовать в разных программах (Даёш открытие исходники!!!!! smile  smile ), но дело в том что пишу исключительно кодом - тойсь Студией пользуюся лиш как компилятором и варинты типа АДД РЕФЕРАНС а потом накарлякать юзинг МайДЛЛ непропрёт вот и вопрос

Как используя только код подключить другую сброрку, чтобы мона было использовать ее методы?????

пока нашол самое похожое Assembly.Load() - но это походу не то

плиз хочу ЛИСТ ор ПРИМЕРЧИК smile  smile  smile 



--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
RWander
Дата 12.12.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 4.5.2006
Где: Russia.Udm.Izhevs k

Репутация: 1
Всего: 6



Код

using System.Runtime.InteropServices;

.....

 [DllImport("MyDll.dll")]                                
  public extern static void MethodInDll();


Добавлено через 1 минуту и 52 секунды
в DllImport пишешь  путь к своей dll-ке, затем метод который хочешь импортировать из dll



--------------------
Microsoft Certified Technology Specialist - ASP.NET Applications
PM MAIL   Вверх
Azzdorf
  Дата 12.12.2007, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.3.2007

Репутация: нет
Всего: нет



респект RWander примерчик ничего, но начал разбираться чуть нето smile  smile  smile  - более используеться для сборок на С, к тому же не все так просто там еще кучу атрибутов нана правильно прописать, но всё равно спасибо и в том тож разобрался - ну сильно уж сложно smile 

зато подтолкнул к другой идее (где-то рядом было smile )
через Assembly.Load("DLLname");  smile  плюс чучуть позднего связывания smile 

using System.IO;
using System.Reflection;

Код

public class MyClass : Form
{
        MyClass()
        {
        public void MyMethod()
              {
              Assembly asm;
              asm = null;
             asm = Assembly.Load("DLLname");
             Type lateTYPE = asm.GetType("lDLLname.CLASSinDLL");
             object obj = Activator.CreateInstance(lateTYPE);
             MethodInfo mi = lateTYPE.GetMethod("DLLmethod");
             object[] parramAr = {"", "", ... , ""};
             mi.Invoke(obj, parramAr);
             }
        }
}



я открыт для предложений - мож это вообще не эффективно и поздное связывание не в тему
подкинте еще вариантики плиз smile  smile  smile 
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
Simargl
Дата 12.12.2007, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.12.2007

Репутация: нет
Всего: нет



Azzdorf,  не буду врать, по поводу как подключается через AddReference... но что-то разницы в быстродействии я не заметил.

Да и иногда удобно использовать Reflection, облегчает жизнь очень.
PM MAIL   Вверх
tol05
Дата 12.12.2007, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 36
Всего: 170



Azzdorf, что-то непонятна твоя цель.

Есть раннее (статическое) связывание - через references и компиляцию
Есть позднее (динамическое) связывание - через AppDomain, Assembly, Type.

Можно конечно и код на лету генерировать, и сборки, и компилировать программно, но зачем?
Ты, как я понял, пишешь dll-ки? Ну и пиши.  Нужно использовать? Используй smile

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


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
izekia
Дата 13.12.2007, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 5.12.2007

Репутация: 1
Всего: 3



Azzdorf, по поводу такой загрузки - у тебя может возникнуть проблема с безопасностью
я делал через лоад фром, где указывал евиденс текущей сборки
по поводу вызова метода - добавь в основном теле или в ссылки интерфейс или базовый тип, 
просто через инвокмембер или как ты делаешь - не совсем удобно и наглядно получается 
PM MAIL   Вверх
Azzdorf
  Дата 13.12.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.3.2007

Репутация: нет
Всего: нет



2 tol05 тут как раз дело в том что DLL никогда не писал, ранее был один файл сборки и поэтому в плане подключения и использования вообще ноль - поэтому над этим сейчас работаю и  smile, также не приходилось никогда и работать не с ранним не с поздним связыванием, не с статическими сслками, если есть возможность подскажы как это нимимумом кода сделать, а выше лишь пока самое оптимальное решение, которое я нашол


2 izekia ну с интерфесами я еще не работал - просто небыло потребности (пишу программы лишь в свое удовольствие, правда есть уже один комерческий проект), а вот по поводу безопасности сейчас разбираюсь в осбусификаторах, и как до этого времени почитал внутрености метода уже не можна будет прочитать, думал этого будет хватит для безопасности


2 all если кто знает самый оптимальный вариант по скорости и еффективности использования ресурсов - всегда открыт для предложений (к теме библиотека - что то типа LOG-системы, неспрашивайте даже зачем писал если есть стандартная просто было инстересно было это сделать, когда закончу - выложу полный исходник ДЛЛ - что-то очень простое, но удобное для меня лично, но мож кому-то пригодится, там есть интересные решения)
 smile 
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
izekia
Дата 13.12.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 5.12.2007

Репутация: 1
Всего: 3



Azzdorf, интерфейс это фактически описание контракта класса
под безопасностью я имел в виду внутренний механизм платформы дот нет для обеспечения безопасности 
PM MAIL   Вверх
tol05
Дата 13.12.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 36
Всего: 170



Azzdorf

Цитата(Azzdorf @  13.12.2007,  09:14 Найти цитируемый пост)
тут как раз дело в том что DLL никогда не писал

создаешь проект "Class Library", туда - твои классы с методами. Скомпилировал - и вот уже dll есть. Пишешь ее на CD-ROM и ставишь на полку. Библиотека классов создана!  smile 

Но ты же код пишешь для повторного использования (в других проектах)? Ну так создаешь проект и если он должен использовать код библиотеки - используешь статической связывание сборки библиотеки со сборкой проекта (приложения или еще одной бибдиотеки). Add reference используй. В коде - через using... Одним словом - все так же, как и со стандартными библиотеками .Net (System.Data.dll например)

При статическом связывании компилятор может поверить защищенность типов, правильность и допустимость ссылок, оптимизировать код. За счет этого быстродействие твоего приложения в целом будет выше, чем при динамическом связывании (через рефлексию). Потому что при динамическом связывании тебе прийдется в твоем проекте-клиенте оперировать не типами, описанными в твоей dll, а типом object. И в runtime будут снижать производительность приведения типов, многочисленные проверки (а их нужно писать самому - значит объем кода приложения клиента выростет) ... Компилятор не будет оптимизировать код.

Ну и т.д.
Мне кажется, вполне очевидно какой вариант является оптимальным (и с точки зрения быстродействия, и с точки зрения ресурсов, той же памяти). Просто динамическое связывание применяют в редких случаях. Например, когда ты запускает приложение-клиент, а dll - из сети подгружаешь... Или когда плагин новый к старому приложению выпускаешь...


Это сообщение отредактировал(а) tol05 - 13.12.2007, 12:00


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Azzdorf
  Дата 13.12.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.3.2007

Репутация: нет
Всего: нет



Цитата(tol05 @ 13.12.2007,  11:58)
создаешь проект "Class Library", туда - твои классы с методами. Скомпилировал - и вот уже dll есть. Пишешь ее на CD-ROM и ставишь на полку. Библиотека классов создана!  smile 

Но ты же код пишешь для повторного использования (в других проектах)? Ну так создаешь проект и если он должен использовать код библиотеки - используешь статической связывание сборки библиотеки со сборкой проекта (приложения или еще одной бибдиотеки). Add reference используй. В коде - через using... Одним словом - все так же, как и со стандартными библиотеками .Net (System.Data.dll например)

библиотеки то писать умею - просто до этого момента не чувствовал острой потребности. А про то что пользуюсь только кодом (см. сообщение 1) и АДДреферанс (см. сообщение 1) не совем для меня так мне нравиться смотреть так сказать в глубь проблемы + специфика программа, которые ставяться с очень урезаным доступоми, вообщем за советы спосибо, но тут тогда вопрос:

Есть ли альтернатива статической подгрузки, через использование (Add Referance...  and using DLLL) ????? smile 
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
tol05
Дата 13.12.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 36
Всего: 170



Нет. Потому что компилятор должен знать, что он компилирует. И если в коде не указаны референсы и using-и, то это (как считает компилятор) - не код, а набор безсмысленных символов. 
Можно конечно перед вызовом компилятора (csc.exe) самому открывать файлы солюшена и проекта, вручную (или через свою утилиту) прописывать настройки (то, что делает студия при Add reference), потом вручную прописать using-и в файле кода... 
Можно вообще открыть файл кода потоком и replace любые имена и типы... Но я такого не делал (и в обозримом будущем не планирую).

P.S. можно запускать компилятор с командной строки и там указывать /reference  но в коде все равно нужно прописывать имена типов. Иначе с ними работать можно только через рефлексию.

Это сообщение отредактировал(а) tol05 - 13.12.2007, 17:32


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Azzdorf
  Дата 13.12.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.3.2007

Репутация: нет
Всего: нет



ввобщем с "подводными течениеми" в моей голове (мол только кодом) - поздное связывание - найлучший вариант??????? smile 
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
tol05
Дата 13.12.2007, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 36
Всего: 170



Это универсальный вариант, но и самый медленный. За все нужно платить smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Azzdorf
  Дата 13.12.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.3.2007

Репутация: нет
Всего: нет



огромное спасибо всем проблема решена

спасибо izekia за просвет в безопасности (это отдельная тема для разговора)

и 

ОГРОМНОЕ пасибки tol05, будем дерзать знания
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
izekia
Дата 14.12.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 5.12.2007

Репутация: 1
Всего: 3



tol05, а что мешает объявить интерфейс в основной программе?
есть куча вариантов использовать динамическую загрузку и не пользоваться рефлексией + удобно очень то что не надо пересобирать все с кучей зависимостей, а просто компилишь одну библиотеку и подгружаешь ее не перегружая весь проект
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0875 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.