Re: Неуправляемые плагины и .net приложение
От: Nuald Россия http://nuald.blogspot.com
Дата: 09.10.06 02:11
Оценка:
Здравствуйте, Андрей Титов, Вы писали:

АТ>Очень прошу простой пример, как вызвать Функцию

АТ>Предположим все плагины экспортируют некоторую функцию
АТ>(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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.