Я только начинаю разбираться с .net, так что попрошу сильно не пинать
Вопрос:
Написал я некоторое приложение на .net.
Хочу добавить подержку плагинов, при этом что бы плагины можно
было писать хоть на ассемблере.
Очень прошу простой пример, как вызвать Функцию
Предположим все плагины экспортируют некоторую функцию
(delphi прототип):
function Test(const TestStr : string) : string;
Как мне её элементарно вызвать?
Я пытался так:
lh := LoadLibrary("Plugin1.dll");
GetProcAddress(lh, "Test");
GetProcAddress возвращает значение типа IntPtr, а что с ним делать, как вызвать?
Вообщем я был бы невероятно рад примеру.
Здравствуйте, Андрей Титов, Вы писали:
АТ>Очень прошу простой пример, как вызвать Функцию
АТ>Предположим все плагины экспортируют некоторую функцию
АТ>(delphi прототип):
АТ>АТ>function Test(const TestStr : string) : string;
АТ>
АТ>Как мне её элементарно вызвать?
Используя атрибут DllImport.
АТ>Я пытался так:
АТ>АТ>lh := LoadLibrary("Plugin1.dll");
АТ>GetProcAddress(lh, "Test");
АТ>
АТ>GetProcAddress возвращает значение типа IntPtr, а что с ним делать, как вызвать?
Здесь можно покопать в сторону класса Marshal. Но скорей всего ничего не получится — явно способа использовать Dll-ки из разных мест нет.
Однако есть несколько путей:
1) Написать C++/CLI-сборку, в которой будет весь нужный вам C++-ый код, и которая наружу будет отдавать методы для работы из управляемого кода.
2) Использовать способ, описанный с статье MSDN "Using Win32 and Other Libraries":
There is no way to specify where you would like DLLImport to look for a file at runtime. There is, however, a trick that you can use to get this to work.
DllImport calls LoadLibrary() to do its work. If a specific DLL has already been loaded into a process, LoadLibrary() will succeed, even if the specified path for the load is different.
This means that if you call LoadLibrary() directly, you can load your DLL from wherever you want, and then the DllImport LoadLibrary() will use that version.
Because of this behavior, it's possible that LoadLibrary() can be called ahead of time to forward your calls to a different DLL. If you're writing a library, you can prevent this by calling GetModuleHandle() to make sure that the library hasn't been loaded previously before you make your first P/Invoke call.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>