C# и LoadLibrary
От: Octane Россия  
Дата: 23.01.05 20:50
Оценка:
Такая проблема возникла..

Есть необходимость загружать в программу функции из внешних модулей(попросту говоря — плагинов). В Си++ можно было бы просто обойтись набором из LoadLibrary, FreeLibrary и GetProcAddress, а здесь даже не знаю что и делать.
Через DllImport я так понимаю не получиться загрузить функции ибо имя библиотеки не константа, тогда загружаем "джентельменский набор" из kernel32.dll

public class Plugin
    {
        public delegate void Type1();
        public delegate string Type2();
        public delegate int Type3();
        public delegate string Type4(int n);

        public Type1 Func1A;
        public Type1 Func1B;
        public Type2 Func2;
        public Type3 Func3;
        public Type4 Func4;

        private int hModule;
        public Plugin(string FileName)
        {
            hModule = LoadLibrary(FileName);
            // ???
        }
        ~Plugin()
        {
            FreeLibrary(hModule);
        }

        [DllImport("kernel32.dll", EntryPoint="LoadLibraryW")]
        private static extern int LoadLibrary(string FileName);
        [DllImport("kernel32.dll")]
        private static extern bool FreeLibrary(int hModule);
        [DllImport("kernel32.dll")]
        private static extern int GetProcAddress(int hModule, string ProcName);
    }


если бы загружаемые функции имели одинаковый прототип можно было бы поменять последнюю строчку
        private static extern Type GetProcAddress(int hModule, string ProcName);


но прототипы различны ... что делать ?
Re: C# и LoadLibrary
От: Юнусов Булат Россия  
Дата: 24.01.05 02:30
Оценка:
Здравствуйте, Octane, Вы писали:

http://www.visualdesign.ru/Vng/Publ/Plugins.aspx
Re[2]: C# и LoadLibrary
От: Octane Россия  
Дата: 24.01.05 06:24
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>http://www.visualdesign.ru/Vng/Publ/Plugins.aspx


Это то понятно, но мне нужно загрузить разнотипные функции из unmanaged библиотеки ..
Re: C# и LoadLibrary
От: Aggtaa Россия  
Дата: 24.01.05 15:46
Оценка:
Здравствуйте, Octane, Вы писали:

O>Есть необходимость загружать в программу функции из внешних модулей(попросту говоря — плагинов). В Си++ можно было бы просто обойтись набором из LoadLibrary, FreeLibrary и GetProcAddress, а здесь даже не знаю что и делать.

O>Через DllImport я так понимаю не получиться загрузить функции ибо имя библиотеки не константа, тогда загружаем "джентельменский набор" из kernel32.dll

O>если бы загружаемые функции имели одинаковый прототип можно было бы поменять последнюю строчку

O>private static extern Type GetProcAddress(int hModule, string ProcName);
O>но прототипы различны ... что делать ?

private static extern Delegate GetProcAddress(int hModule, string ProcName) не годится?
A.
C# и LoadLibrary
От: Аноним  
Дата: 23.01.05 21:58
Оценка:
А плагины на чем написаны?
На .Net?

Используй Assembly.LoadFrom( fileName );

Если же плагины на комах, то тогда в динамике надо делать LoadTypeLib и потом уже работать с ITypeLib.

Из ITypeLib можно построить assembly на лету через TypeLibConverter, а можно самому разбираться с типами и методами...
С Уважением, Вячеслав.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
C# и LoadLibrary
От: Аноним  
Дата: 23.01.05 22:00
Оценка:
Чтобы не было проблем со сборкой мусора лучше в функции передавать HandleRef.

[DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
private static extern IntPtr LoadLibrary(string libname);

[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
private static extern bool FreeLibrary(HandleRef hModule);

[DllImport("kernel32.dll", CharSet=CharSet.Ansi)]
private static extern IntPtr GetProcAddress(HandleRef hModule, string lpProcName);


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
C# и LoadLibrary
От: Аноним  
Дата: 23.01.05 22:48
Оценка:
В случае если нужно вызывать обычные длл, то советую глянуть сюда. Мне понравилась компактная реализация дополнительной dll-ки на асме.
С Уважением, Вячеслав.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: C# и LoadLibrary
От: Аноним  
Дата: 24.01.05 06:59
Оценка:
Так ведь надо сперва определиться какие функции хочется уметь вызывать.
С Уважением, Вячеслав.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
C# и LoadLibrary
От: Аноним  
Дата: 24.01.05 12:02
Оценка:
В FW 2.0 есть метод Marshal.GetDelegateForFunctionPointer(IntPtr unmanagedFuncPtr, Type delegateType).

Естественно надо знать: какие параметры у вызываемой функции, иначе не получится определить правильный тип делегата.




данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.