Преобразование статической библиотеки ссылок к динамическому dll

У меня есть .lib файл с его заголовком (.h) файл. Этот файл имеет несколько функций, которые должны использоваться в приложении C#.

После поиска с помощью Google я нашел, что должен создать динамический DLL из этой статической библиотеки и назвать этот динамический DLL из кода C# с помощью interop.

  1. Я создал win32 проект и выбрал, вводят DLL.
  2. Включенный заголовочный файл и добавил .lib к дополнительным зависимостям.

    Я могу видеть функции, определяемые в статической библиотеке (когда я нажимаю ctrl + пространство).

Как общий новичок я не знаю, как я могу экспортировать функцию, которая является в .lib со следующей подписью:

void testfun( char* inp_buff, unsigned short* inp_len, char* buffer_decomp,unsigned *output_len,unsigned short *errorCode)

Я хочу ту же подпись в своем динамическом DLL с другим именем.

Что записать в заголовочном файле и .cpp файле?

15
задан Benjamin 29 November 2013 в 19:13
поделиться

3 ответа

Если вы можете перекомпилировать вашу lib, просто добавьте __declspec(dllexport) к подписям всех функций, которые вы хотите экспортировать.

void __declspec(dllexport) testfun( char* inp_buff, unsigned short* inp_len, char* buffer_decomp,unsigned *output_len,unsigned short *errorCode)

Если вы не можете этого сделать, то вы можете экспортировать их, написав вместо этого файл .def. С помощью def-файлов можно даже изменить имя функции при ее экспорте. http://msdn.microsoft.com/en-us/library/28d6s79h.aspx

---- содержимое mylib.def ----

LIBRARY

EXPORTS
   testfun
   newname=testfun2

Затем при линковке dll включите mylib.def

link /dll /machine:x86 /def:mylib.def  mylib.lib

Edit2:

обратите внимание, что pinvoke предполагает, что функции, которые вы импортируете, будут иметь соглашение о вызове _stdcall, если вы не скажете иначе. Поэтому вам может понадобиться сделать это и в коде C#.

[DllImport("mylib.dll", CallingConvention=CallingConvention.Cdecl)]

Или, вы можете изменить ваш C++ код, чтобы он был __stdcall

void __declspec(dllexport) __stdcall testfun( char* inp_buff, ...
8
ответ дан 1 December 2019 в 04:27
поделиться

Это то, что вы можете сделать.

  1. Добавьте следующий код в ваш .H файл. переименуйте "MYPROJECT" в название вашего проекта

     #ifdef MYPROJECT_EXPORTS 
     # define MYPROJECT_API __declspec (dllexport) 
     # else 
     # define MYPROJECT_API _declspec (dllimport) 
     #endif 
     
  2. Перейдите в Свойства-> C ++ -> Препроцессор и добавьте определение - MYPROJECT_EXPORTS

  3. Добавьте MYPROJECT_API ко всем функциям, которые должна предоставлять DLL, например:

     MYPROJECT_API void Test () ; 
     
  4. Перейдите в Свойства проекта Общие -> Тип конфигурации измените его на Dynamic Dll

Готово

3
ответ дан 1 December 2019 в 04:27
поделиться

Создайте новый Dll проект с помощью Visual Studio Application Wizard, и отметьте "Exports Symbols" в одном из шагов мастера. Это создаст образец Dll, который экспортирует класс, функцию и переменную. Вы можете узнать из этого примера, как это делается. Обычно каждая экспортируемая функция объявляется как __declspec(dllexport). В клиентском проекте она объявляется как __declspec(dllimport). Dll код использует константу, которая внутри Dll проекта объявлена как __declspec(dllexport), и __declspec(dllimport) в любом другом месте.

3
ответ дан 1 December 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: