Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > [DllImport("")] точка входа .NET


Автор: dimonpage1 15.10.2007, 10:52
Добрый день.
Опишу проект...
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 или может есть другое решение организации всего проекта?


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










Автор: iad 15.10.2007, 11:13
нужно в отдельной сборке объявить интерфейс который будет доступен и в приложени и в 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; не забудь

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

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

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

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

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

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

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

спасибо за наводку, но можно немного прокомментировать ваш вариант, особенно меня интересует класс "IMyTypeExportedFromDll"
как эта схема работает? smile

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

Автор: tol05 15.10.2007, 13:00
Увидел  [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);

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

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


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

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

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

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

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

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

Автор: dimonpage1 16.10.2007, 12:53
вот что я нарыл...
Код

 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); 


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)