Как создавать и использовать dll-файлы на C#

#c #dll #load #dllimport

#c #dll #загрузить #dllimport

Вопрос:

В настоящее время я пытаюсь научиться писать и использовать.dll-файлы для Windows на C # и C . Я думаю, что как только я пойму один из этих языков, я смогу довольно легко разобраться с другим. Сегодня я искал более 5 часов, но так и не смог найти работающий.руководство по dll. Они либо устарели и отказываются работать с моим компилятором, либо просто представляют собой полный мусор. Кто-нибудь знает хорошее руководство, которое работает? Я использую Dev C и VC 2010. Спасибо, что помогли мне! 🙂

Ответ №1:

Библиотеки DLL в C # и C несколько отличаются, особенно в том, как они используются. C # использует сборки, в которые упакованы всевозможные метаданные, и скрывает большинство деталей. C этого не делает, вы должны сообщить ему, что экспортируется и как.

Создание DLL обычно состоит из написания вашего кода, затем для каждого класса или функции, которые вы хотите использовать (извне DLL), добавьте этот бит:

 int __declspec(dllexport) function(int param);
class __declspec(dllexport) object;
  

Это «экспортирует» символы, делая их видимыми извне DLL. Вам нужно сделать это только для тех, которые будут использоваться извне, и для классов, только для класса (не для каждого метода).

При использовании DLL вы захотите включить заголовок, содержащий все функции, но с __declspec(dllimport) примечаниями. Это сообщит вашему коду, что они используются из внешней библиотеки DLL. Вам нужно предоставить библиотеку (созданную при компиляции DLL) компоновщику в качестве входного файла, и все должно выстроиться в линию.

Простой способ справиться с этим -:

 #ifndef IMPORT_MYLIB
#    define MYLIB_API __declspec(dllexport)
#else
#    define MYLIB_API __declspec(dllimport)
#endif

int MYLIB_API function();
  

При использовании DLL в другом приложении просто #define IMPORT_MYLIB и заголовок будет настроен соответствующим образом.

Для C # вам нужно просто создать библиотеку с общедоступными классами, затем добавить ее в качестве ссылки на другой проект. Затем вы можете использовать классы из него, и два файла будут автоматически связаны вместе (намного проще, но не всегда так чисто, как метод C ).

Обратите внимание, что библиотеки DLL зависят от Microsoft, и есть немало мелких деталей, которые могут вас заинтересовать позже (как выполняется поиск импорта и тому подобное).

Ответ №2:

Библиотеки DLL в C # очень просты.

  1. Создайте новый проект, который создается на базе dll.
  2. Добавьте ссылку на новый проект dll в свой существующий проект.
  3. Используйте классы, помеченные как общедоступные в вашей dll, как если бы они были частью вашего исходного проекта.

Peachykeen изложил самый простой способ экспорта классов и функций из C DLL. Я бы предложил более продвинутый метод. Вместо экспорта каждого нужного вам класса, производите все ваши классы в dll из интерфейсов (класс с по крайней мере одним чисто виртуальным методом). Затем экспортируйте заводские функции, которые возвращают указатели на эти интерфейсы. Это уменьшает связь между вашим основным исполняемым файлом и dll, поскольку вам нужно только совместно использовать интерфейсы, а не какие-либо детали реализации.

В Code project есть хорошая статья об этой технике.

http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx

Одним из приятных преимуществ описанного выше подхода является то, что он значительно сокращает время компиляции. Вы можете полностью переопределить DLL без необходимости перекомпиляции основного приложения.

Комментарии:

1. Использование виртуальных функций и фабрик может работать, с этим может быть проще работать, чем с экспортом, но я думаю, что это немного сложнее настроить. На самом деле, просто разные стили, и оба работают нормально.

Ответ №3:

В Visual Studio они теперь называются «сборками» вместо DLL. Изменение терминологии сбивает с толку. Создание DLL состоит из простого создания проекта нужного типа и добавления вашего кода. Однако использование DLL из другого языка или компилятора может оказаться непростой задачей.

Вы пробовали этот урок?

Комментарии:

1. Почему отрицательные отзывы? Ответ неполный, поскольку он не касается C , но сторона C # верна и ссылка актуальна.