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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [DllImport("")] точка входа .NET, Динамическая подгрузка DLL 
V
    Опции темы
dimonpage1
Дата 15.10.2007, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день.
Опишу проект...
1. Создал проект с формой MDI контейнера и хочу в этом проекте открывать окна которые будут храниться в DLL
2. Создал DLL с формой, функциями и процедурами.
3. Подключил в проект DLL черер ADD REFERENCE
все чудово!

Но так как я использую ClickOnce, при каждом изменении одной из своих DLL мне приходится создавать новый Publish основного проекта.
хотелось бы скинуть все dll в папочку и новые версии DLL подкидывать в нее не создавая паблишей.
т.е. что бы программа при запуске динамически подгружала все DLL

создал тестовый проект и пробую на нем обращение к DLL
Код

[DllImport(@"d:\Мои документы\Visual Studio 2005\Projects\DLLForm\DLLForm\bin\Debug\DLLForm.dll")], EntryPoint = "ShowForm1",              ExactSpelling = false, CharSet = CharSet.Unicode, SetLastError = true)]
static extern bool ShowForm1(); 

private void button1_Click(object sender, EventArgs e)
        {
            ShowForm1();
        }


в Dll такое:
Код

public static void ShowForm1()
        {
            MessageBox.Show("sdfg");          
        }


при нажатии на кнопку выдает эту ошибку
Unable to find an entry point named 'ShowForm1' in DLL 'd:\Мои документы\Visual Studio 2005\Projects\DLLForm\DLLForm\bin\Debug\DLLForm.dll'.
ошибка говорит о отсутсвтии точки вхождения

============================================
ВОПРОС: как создать точку вхождения в DLL
я немного порылся в нете и там пишут, что к библиотекам(DLL) написанным под .NET нужно обращаться только через ADD REFERENCE, а мне так неудобно....

подскажите что я делаю не так в DLL или может есть другое решение организации всего проекта?


спасибо за внимание...










PM MAIL   Вверх
iad
Дата 15.10.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нужно в отдельной сборке объявить интерфейс который будет доступен и в приложени и в dll, в dll реализуешь этот интерфейс, а в основном приложении загружаешь dll примерно так:
Код


            Assembly asm=Assembly.LoadFile("path\\plugin.dll");
            foreach (Type type_ in asm.GetExportedTypes())
            {
                if (type_.GetInterface(typeof(IMyTypeExportedFromDll).FullName) != null)
                {
                    IMyTypeExportedFromDll MyTypeInstance = (IMyTypeExportedFromDll)Activator.CreateInstance(type_);
                }
            }


и using System.Reflection; не забудь

зы ачепятку поправил

Это сообщение отредактировал(а) iad - 15.10.2007, 12:30
PM MAIL   Вверх
tol05
Дата 15.10.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



dimonpage1, а почему у тебя в dll функция описана, как возвращающая void, а в твоем коде она уже bool возвращать должна?


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


Новичок



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

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



Цитата(tol05 @ 15.10.2007,  11:30)
dimonpage1, а почему у тебя в dll функция описана, как возвращающая void, а в твоем коде она уже bool возвращать должна?

сори, это я пробовал... но суть вопроса в другом )

iad, можно немного коментов про блок внутри foreach?

Это сообщение отредактировал(а) dimonpage1 - 15.10.2007, 12:00
PM MAIL   Вверх
iad
Дата 15.10.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(dimonpage1 @  15.10.2007,  12:49 Найти цитируемый пост)
но суть вопроса в другом
конечно в другом. Для динамической загрузки управляемых сборок используется класс Assembly, а не DllImport, который предназначен для импорта функций из неуправляемых dll

PM MAIL   Вверх
dimonpage1
Дата 15.10.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(iad @ 15.10.2007,  12:05)
Цитата(dimonpage1 @  15.10.2007,  12:49 Найти цитируемый пост)
но суть вопроса в другом
конечно в другом. Для динамической загрузки управляемых сборок используется класс Assembly, а не DllImport, который предназначен для импорта функций из неуправляемых dll

спасибо за наводку, но можно немного прокомментировать ваш вариант, особенно меня интересует класс "IMyTypeExportedFromDll"
как эта схема работает? smile
PM MAIL   Вверх
iad
Дата 15.10.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(dimonpage1 @  15.10.2007,  13:10 Найти цитируемый пост)
класс "IMyTypeExportedFromDll"
Это твой класс, точнее интерфейс который должен быть реализован в твоей dll и виден и в dll и в приложении. Обозвать его можешь как хочешь. Но по большому заморачиваться на динамическую загрузку сборок имет смысл если ты озаботился поддержкой плагинов... а так непонятно в чем у тебя проблема при использовании автоматически загружаемых сборок.. Просто создай солюшн в котором будут все проекты: и длл и основной программы.. 

PM MAIL   Вверх
tol05
Дата 15.10.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Увидел  [DllImport("")]  и просто не заметил, что библиотека управляемая. 

Просто:
- вызывай Assembly.Load(...)
 -создавай свой тип, без всяких интерфейсов 
Код

Assembly myAssembly = Assembly.Load(@"d:\Мои документы\Visual Studio 2005\Projects\DLLForm\DLLForm\bin\Debug\DLLForm.dll");
Type myType = myAssembly.GetType("myType");
myType.InvokeMember("ShowForm1", BindingFlags.Public | BindingFlags.Static, null, null, null);



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


Шустрый
*


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

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



Цитата(tol05 @  15.10.2007,  14:00 Найти цитируемый пост)
просто не заметил, что библиотека управляемая.
лох - он всегда лох

PM MAIL   Вверх
tol05
Дата 15.10.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(iad @  15.10.2007,  18:50 Найти цитируемый пост)
лох - он всегда лох


Это как понимать?! А ну-ка поподробнее!


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


Шустрый
*


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

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



Цитата(tol05 @  15.10.2007,  20:26 Найти цитируемый пост)
Это как понимать?! 
Когда научишься код нормально читать, а не через полдня Ё "просто не заметил" тогда поймешь..

PM MAIL   Вверх
tol05
Дата 15.10.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



опять от тебя грубость! Да что ж такое!!! Уже и минус один не помогает... Так что еще один ставить - смысла нет.

Гм.. нужно бороться со своими комплексами. Иначе, раньше или позже, iad, ваше (почему "ваше" с маленькой буквы, думаю понятно) психическое здоровье будет непоправимо нарушено. 
А пока буду считать, что вы не совсем четко себя контролируете, и находились (в момент "постерства" smile ) "в невменяемом состоянии"... И не более. 


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


Шустрый
*


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

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



Цитата(tol05 @  15.10.2007,  21:25 Найти цитируемый пост)
Уже и минус один не помогает
подлецы смелые, когда занют что им не ответят(правила форума понимаешь)

PM MAIL   Вверх
tol05
Дата 15.10.2007, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ну так в чем проблема, любезный? 
Повторите свой последний пост еще 36 раз и вперед, "на кнопочки"...


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


Новичок



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

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



вот что я нарыл...
Код

 Assembly net11 = Assembly.LoadFile(@"d:\Мои документы\Visual Studio 2005\Projects\DLLForm\DLLForm\bin\Debug\DLLForm.dll"); 

// имя сборки и ее версия
//            AssemblyName nameas = net11.GetName();
//            listBoxControl1.Items.Add(nameas.Name+" (" +nameas.Version.ToString()+")"); 
           
            Type test = net11.GetType("DLLForm.UserControl1"); 
            object o = Activator.CreateInstance(test);
            
            MethodInfo meth = test.GetMethod("ShowForm1");
            meth.Invoke(o, null); 


всем спасибо за подсказки

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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