Как использовать интерфейс из отдельной сборки
От: DJazz  
Дата: 17.11.04 16:26
Оценка:
У меня есть сборка она же ДЛЛ, я в ней создал простенький интерфейс

interface crefInterface
{
void OpenForm();
void OpenList();
void Save();
void Close();
}

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

public class iBanks : crefInterface
{
public iBanks()
{
}
}

Чет, я повис, подскажите плз...
Re: Как использовать интерфейс из отдельной сборки
От: Walker США  
Дата: 17.11.04 16:35
Оценка:
Здравствуйте, DJazz, Вы писали:

DJ>У меня есть сборка она же ДЛЛ, я в ней создал простенький интерфейс


DJ>Теперь я создаю отдельную сборку с объектом который будет имплементировать интерфейс, как загрузить сборку с интерфейсом чтоб я потом смог написать


DJ>public class iBanks : crefInterface


Добавь референс на сборку с этим интерфейсом. В студии это right click на References -> Add Reference.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Как использовать интерфейс из отдельной сборки
От: DJazz  
Дата: 18.11.04 06:51
Оценка:
Здравствуйте, Walker, Вы писали:

W>Здравствуйте, DJazz, Вы писали:


DJ>>У меня есть сборка она же ДЛЛ, я в ней создал простенький интерфейс


DJ>>Теперь я создаю отдельную сборку с объектом который будет имплементировать интерфейс, как загрузить сборку с интерфейсом чтоб я потом смог написать


DJ>>public class iBanks : crefInterface


W>Добавь референс на сборку с этим интерфейсом. В студии это right click на References -> Add Reference.



У меня сборка с интерфейсом может лежать где угодно, т.е. пути будут известны только в ходе выполнения программы, мне наверно нужно

Object i = Activator.CreateInstanceFrom(......);

Но как ? Экземпляр интерфейса не создаш !
Re[3]: Как использовать интерфейс из отдельной сборки
От: Andrbig  
Дата: 18.11.04 07:42
Оценка:
Здравствуйте, DJazz, Вы писали:

DJ>У меня сборка с интерфейсом может лежать где угодно, т.е. пути будут известны только в ходе выполнения программы, мне наверно нужно


DJ>Object i = Activator.CreateInstanceFrom(......);


DJ>Но как ? Экземпляр интерфейса не создаш !


Ты путаешь design и runtime.

Для создания своей сборки тебе всяко нужна та dll, ибо там находится определение интерфейса. Так что — reference (возможно с CopyLocal = false)

При работе же система захочет получить ту сборку и если она у тебя бегает туда-сюда и на месте не лежит ( ), то лови что-то типа Domain.AssemblyResolve, ручками грузи эту сборку и отдавай системе.

А вообще-то, почему она бегает и "лежит где угодно"?
Re[4]: Как использовать интерфейс из отдельной сборки
От: DJazz  
Дата: 18.11.04 10:13
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Здравствуйте, DJazz, Вы писали:


DJ>>У меня сборка с интерфейсом может лежать где угодно, т.е. пути будут известны только в ходе выполнения программы, мне наверно нужно


DJ>>Object i = Activator.CreateInstanceFrom(......);


DJ>>Но как ? Экземпляр интерфейса не создаш !


A>Ты путаешь design и runtime.


A>Для создания своей сборки тебе всяко нужна та dll, ибо там находится определение интерфейса. Так что — reference (возможно с CopyLocal = false)


A>При работе же система захочет получить ту сборку и если она у тебя бегает туда-сюда и на месте не лежит ( ), то лови что-то типа Domain.AssemblyResolve, ручками грузи эту сборку и отдавай системе.


A>А вообще-то, почему она бегает и "лежит где угодно"?



Интерфейс лежит в каждой БД и мне нужно грузить ее постоянно при старте базы данных, их может быть несколько путь я буду знать в момент старта программы, вот мне нужно как раз "ручками грузи эту сборку и отдавай системе" а с кодом чтоб ее ручками загрузить проблемы, как ее загрузить чтоб можно было интерфейс реализовать, даже не знаю с какой стороны подступиться
Re[5]: Как использовать интерфейс из отдельной сборки
От: Walker США  
Дата: 18.11.04 14:40
Оценка:
Здравствуйте, DJazz, Вы писали:

DJ>Интерфейс лежит в каждой БД и мне нужно грузить ее постоянно при старте базы данных, их может быть несколько путь я буду знать в момент старта программы, вот мне нужно как раз "ручками грузи эту сборку и отдавай системе" а с кодом чтоб ее ручками загрузить проблемы, как ее загрузить чтоб можно было интерфейс реализовать, даже не знаю с какой стороны подступиться


Мне кажется, ты что-то очень серьезно путаешь. Интерфейс первичен, реализация — вторична, если можно так выразиться Нельзя реализовать то, чего не знаешь. Так что на этапе компиляции тебе в любом случае надо иметь эту сборку с интерфейсом. А вот насчет рантайма я тебя совершенно не понял. Может тебе наоборот надо реализацию динамически подгружать? Можешь подробнее описать что надо сделать?
В любом случае с динамической загрузкой тебе поможет класс Activator.
... << RSDN@Home 1.1.3 stable >>
Re[6]: Как использовать интерфейс из отдельной сборки
От: DJazz  
Дата: 18.11.04 16:12
Оценка:
Здравствуйте, Walker, Вы писали:

W>Здравствуйте, DJazz, Вы писали:


DJ>>Интерфейс лежит в каждой БД и мне нужно грузить ее постоянно при старте базы данных, их может быть несколько путь я буду знать в момент старта программы, вот мне нужно как раз "ручками грузи эту сборку и отдавай системе" а с кодом чтоб ее ручками загрузить проблемы, как ее загрузить чтоб можно было интерфейс реализовать, даже не знаю с какой стороны подступиться


W>Мне кажется, ты что-то очень серьезно путаешь. Интерфейс первичен, реализация — вторична, если можно так выразиться Нельзя реализовать то, чего не знаешь. Так что на этапе компиляции тебе в любом случае надо иметь эту сборку с интерфейсом. А вот насчет рантайма я тебя совершенно не понял. Может тебе наоборот надо реализацию динамически подгружать? Можешь подробнее описать что надо сделать?

W>В любом случае с динамической загрузкой тебе поможет класс Activator.



Сенкс, кажется понял где лапухнулся, попробую если что еще спрашу.
Re[6]: Как использовать интерфейс из отдельной сборки
От: DJazz  
Дата: 18.11.04 16:15
Оценка:
Здравствуйте, Walker, Вы писали:

W>Здравствуйте, DJazz, Вы писали:


DJ>>Интерфейс лежит в каждой БД и мне нужно грузить ее постоянно при старте базы данных, их может быть несколько путь я буду знать в момент старта программы, вот мне нужно как раз "ручками грузи эту сборку и отдавай системе" а с кодом чтоб ее ручками загрузить проблемы, как ее загрузить чтоб можно было интерфейс реализовать, даже не знаю с какой стороны подступиться


W>Мне кажется, ты что-то очень серьезно путаешь. Интерфейс первичен, реализация — вторична, если можно так выразиться Нельзя реализовать то, чего не знаешь. Так что на этапе компиляции тебе в любом случае надо иметь эту сборку с интерфейсом. А вот насчет рантайма я тебя совершенно не понял. Может тебе наоборот надо реализацию динамически подгружать? Можешь подробнее описать что надо сделать?

W>В любом случае с динамической загрузкой тебе поможет класс Activator.


А можно ли вынести интерфейс в отдельную сборку, и если можно как его использовать, т.е. что нужно сделать чтоб сборку загрузить и реализовать интерфейс из нее.
Re[7]: Как использовать интерфейс из отдельной сборки
От: Walker США  
Дата: 18.11.04 16:22
Оценка:
Здравствуйте, DJazz, Вы писали:

DJ>Сенкс, кажется понял где лапухнулся, попробую если что еще спрашу.


Ты для начала раздели для себя конкретно, что в компайл-тайм, а что в ран-тайм и все станет на свои места.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Как использовать интерфейс из отдельной сборки
От: DILL Россия http://dilukhin.chat.ru
Дата: 19.11.04 08:40
Оценка:
Здравствуйте, Walker, Вы писали:

W>Добавь референс на сборку с этим интерфейсом. В студии это right click на References -> Add Reference.


Кстати в оболочке студии с References есть неприятная проблема — оболочка в определённый момент блокирует сборку (сборки) из этого списка и после этого сборку не перекомпилировать, не удалить и не переименовать. Особенно это любит делать C# — все сборки блокируются намертво после первой компиляции (хотя, необязательно). MC++ — проекты тоже этим грешат, но не так часто. Мы не проверяли достоверно, после чего и в какой момент блокируются сборки, не до того было. Для проектов MC++ был найден выход — #using сборки в файле stdafx.h. Для C# остаётся только делать выход-вход из студии и/или удаление Reference из проекта и добавление её обратно. Очень удобно, согласитесь, особенно в условиях командной работы, использования SourceSafe и т.д.
Re[3]: Как использовать интерфейс из отдельной сборки
От: DJazz  
Дата: 19.11.04 09:19
Оценка:
Здравствуйте, DILL, Вы писали:

DIL>Здравствуйте, Walker, Вы писали:


W>>Добавь референс на сборку с этим интерфейсом. В студии это right click на References -> Add Reference.


DIL>Кстати в оболочке студии с References есть неприятная проблема — оболочка в определённый момент блокирует сборку (сборки) из этого списка и после этого сборку не перекомпилировать, не удалить и не переименовать. Особенно это любит делать C# — все сборки блокируются намертво после первой компиляции (хотя, необязательно). MC++ — проекты тоже этим грешат, но не так часто. Мы не проверяли достоверно, после чего и в какой момент блокируются сборки, не до того было. Для проектов MC++ был найден выход — #using сборки в файле stdafx.h. Для C# остаётся только делать выход-вход из студии и/или удаление Reference из проекта и добавление её обратно. Очень удобно, согласитесь, особенно в условиях командной работы, использования SourceSafe и т.д.



Большой сенкс за инфу
Re[7]: Как использовать интерфейс из отдельной сборки
От: Andrbig  
Дата: 19.11.04 13:45
Оценка:
Здравствуйте, DJazz, Вы писали:

DJ>А можно ли вынести интерфейс в отдельную сборку, и если можно как его использовать, т.е. что нужно сделать чтоб сборку загрузить и реализовать интерфейс из нее.


Не можно, а нужно! Должно быть три сборки:
1. объявление интерфейса
2. основная программа. Ссылается на 1.
3. сборка из базы. Ссылается на 1.

Схема такова. Основная программа загружается и поскольку там ссылка на 1., то грузит и ее. Ты грузишь другую сборку (из базы), получаешь Assembly. Вызываешь у нее >CreateInstance и полученный object кастишь в интерфейс из сборки 1.

Все. Объект есть, нужный интерфейс он реализует. Вперед!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.