Такая проблема возникла..
Есть необходимость загружать в программу функции из внешних модулей(попросту говоря — плагинов). В Си++ можно было бы просто обойтись набором из 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);
но прототипы различны ... что делать ?
Здравствуйте, Юнусов Булат, Вы писали:
ЮБ>http://www.visualdesign.ru/Vng/Publ/Plugins.aspx
Это то понятно, но мне нужно загрузить разнотипные функции из unmanaged библиотеки ..
А плагины на чем написаны?
На .Net?
Используй Assembly.LoadFrom( fileName );
Если же плагины на комах, то тогда в динамике надо делать LoadTypeLib и потом уже работать с ITypeLib.
Из ITypeLib можно построить assembly на лету через TypeLibConverter, а можно самому разбираться с типами и методами...
С Уважением, Вячеслав.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Чтобы не было проблем со сборкой мусора лучше в функции передавать 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
ссылка на оригинальное сообщение
В случае если нужно вызывать обычные длл, то советую глянуть
сюда. Мне понравилась компактная реализация дополнительной dll-ки на асме.
С Уважением, Вячеслав.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Так ведь надо сперва определиться какие функции хочется уметь вызывать.
С Уважением, Вячеслав.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
В FW 2.0 есть метод Marshal.GetDelegateForFunctionPointer(IntPtr unmanagedFuncPtr, Type delegateType).
Естественно надо знать: какие параметры у вызываемой функции, иначе не получится определить правильный тип делегата.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение