Как создать dll c

от admin

Как создать dll c

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

Создадим и подключим библиотеку классов.

Возьмем имеющийся проект консольного приложения C#, например, созданный в прошлых темах. В структуре проекта нажмем правой кнопкой на название решения и далее в появившемся контекстном меню выберем Add -> New Project. (Добавить новый проект):

Далее в списке шаблонов проекта найдем пункт Class Library :

Библиотека классов в C# и .NET

Затем дадим новому проекту какое-нибудь название, например, MyLib:

Class Library in .NET

После создания этого проекта в решение будет добавлен новый проект, в моем случае с названием MyLib:

Добавление нового проекта в C# и .NET

По умолчанию новый проект имеет один пустой класс Class1 в файле Class1.cs. Мы можем этот файл удалить или переименовать, как нам больше нравится.

Например, переименуем файл Class1.cs в Person.cs, а класс Class1 в Person. Определим в классе Person простейший код:

Новый проект в C# и .NET Core

Теперь скомпилируем библиотеку классов. Для этого нажмем правой кнопкой на проект библиотеки классов и в контекстном меню выберем пункт Rebuild :

Компиляция библиотеки классов в C# и .NET Core

После компиляции библиотеки классов в папке проекта в каталоге bin/Debug/net6.0 мы сможем найти скомпилированный файл dll (MyLib.dll). Подключим его в основной проект. Для этого в основном проекте нажмем правой кнопкой на узел Dependencies и в контекстном меню выберем пункт Add Project Reference. :

Добавление библиотеки классов в проекте на C# и .NET Core

Далее нам откроется окно для добавления библиотек. В этом окне выберем пункт Solution,который позволяет увидеть все библиотеки классов из проектов текущего решения, поставим отметку рядом с нашей библиотекой и нажмем на кнопку OK:

Если наша библиотека вдруг представляет файл dll, который не связан ни с каким проектом в нашем решении, то с помощью кнопки Browse мы можем найти местоположение файла dll и также его подключить.

Создание динамически загружаемой DLL библиотеки на C#

Не так давно у нас появилась необходимость создать расширение для одной программы на языке C# с использованием WPF. Расширение представляет собой динамически загружаемую dll библиотеку, о создании которой и пойдет речь в данной статье.

Нам не удалось найти стандартное средство в языке C# для создание динамической dll, по этому были рассмотрены обходные методы:

Первый способ – это создание динамически загружаемой dll на managed C++, из которой, производилось обращение к сборке на C#

Второй способ – создание сборки на языке C# и путем декомпиляции в IL код и обратно, приведение этой библиотеки к нужному виду.

О втором способе расскажу подробнее:

Создание динамической dll путем пере компиляции в il

Для реализации нам потребуются две утилиты ilasm и ildasm, эти утилиты должны поставляться вместе со средой разработки, у меня они лежали в этих папках:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools

Для удобства я добавил эти пути в Path, потому что придется часто пользоваться этими утилитами в командной строке.

Далее необходимо создать библиотеку классов на языке C#. Функции которые необходимо экспортировать, должны быть публичными и статическими, и находиться в публичном классе. В качестве параметров и возвращаемого значения можно использовать простые типы, такие как string, int.

Пример кода:
public class TestExportClass
<
public static void Run()
<
MessageBox.Show(«Привет из C#»);
>
>

Скомпилируем проект, получаем dll библиотеку. (у меня TestDll.dll)

Теперь необходимо преобразовать dll библиотеку в il код. Для этого нужно запустить ildasm в командной строке со следующими параметрами

ildasm TestDll.dll /OUT:TestDll.il

Далее необходимо проделать некоторые манипуляции с получившимся il кодом.

Во-первых, меняем флаг

Во-вторых, над началом описания классов (обычно эта область отделена комментарием CLASS MEMBERS DECLARATION) добавляем код:

.vtfixup [1] int32 fromunmanaged at VT_01

.data VT_01 = int32(0)

В-третьих, в методе который необходимо сделать экспортируемым добавляем код:

.export [1] as Run

Здесь Run – это название метода, по которому его будет вызывать сборка, написанная на неуправляемом коде.

Теперь необходимо скомпилировать dll библиотку, для этого воспользуемся утилитой ilasm, с параметрами:

ilasm TestDll.il /OUT:TestDll.dll /DLL

Все после этого dll можно использовать как обычную динамически загружаемую dll библиотеку.

Динамическая dll + WPF

Если вы планируете создавать расширение с использованием технологий, требующих, чтобы приложение работало в STA потоке (Например WPF), то необходимо учесть, что поток в котором будет выполняться расширение наследуется от сборки запустившей библиотеку, а значит может быть не в режиме STA.

Для того чтобы обойти эту проблему было решено в расширении создать STA поток и в нем запускать окна на WPF.

Вот так можно модернизировать код для запуска WPF окна:

public static void Run()
<
Thread WPFThread = new Thread(OpenWTPWindow);
WPFThread.ApartmentState = ApartmentState.STA;
WPFThread.Start();
WPFThread.Join();
>

public static void OpenWTPWindow()
<
System.Windows.Window WPFWindow = new System.Windows.Window();
WPFWindow.ShowDialog();
>

Обратите внимание что окно запускается не с помощью функции Show() а ShowDialog(), функция Show() работает некорректно, при использовании её не в основном потоке.

Заключение

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

Справедливости ради стоит заметить, что после завершения вызванной процедуры, подгруженная dll библиотека продолжает находиться в памяти, что вызывает некоторые проблемы:
Например, когда мы создавали расширение для сервиса который постоянно запущен в системе, чтобы установить пользователю обновленное расширение, приходилось временно приостанавливать сервис.

Ссылки по теме

Хорошая статья. Если у вас остались еще какие то вопросы по созданию динамической dll, рекомендую обратиться к ней.

Simple way of creating C/C++ DLL (Dynamic Link Library)

In this article, we discuss the use of Dynamic Link Library (DLL) with a simple example. These libraries contain code and data that can be used by third-party applications. By using a DLL, we will be able to promote code reuse and efficient memory usage. This technique will also allow us to modularize out programs into separate components that can each be used as needed.

Introduction to Dynamic Link Library

A DLL file (Dynamic Link Library) is a type of file that contains data and instructions that are used by other programs and can be called when needed. DLL files allow multiple programs to share functions and classes simultaneously. Unlike executable programs, DLL files cannot be run directly but instead must be called upon by some other program.

Читать:
Top data recovery что это за программа

The word “dynamic” is used to explain that the data is not always available in memory, it is only put to use when the program actively calls for it. DLL files allow to separate a program into multiple unique components which can then be added or removed to include or exclude certain functionalities. This is very useful because it lowers the use of memory since the program does not need to load everything all at once.

C and C++

Microsoft Visual C++ provides multiple extensions to the standard C++ which allow functions and classes to be specified as imported or exported directly in the C++ code. These extensions use the attribute __declspec before a function or class declaration.

Please note that when accessing C functions or classes from C++, the functions must be declared as extern “C” in the C++ code, to inform the compiler not to mangle the functions or classes but rather use the “C” linkage. Because C++ supports function overloading, we can declare more than one functions with the same name and different parameters. We then need to provide the compiler with additional information on the function names to avoid undefined reference errors or linking errors (as C does not support function overloading).

The solution here is to specify extern “C” in our C++ program. When the compiler find an extern “C” block, it ensures that the function names are not mangled — that the compiler emits a binary file with their names unchanged, as a “C” compiler would do. This additional information allows us to avoid linking problems and conflicts in binary code.

Creating DLL

The example below is using Visual Studio 2019 to create and build a simple DLL:

Open Visual Studio and create a new Project. To specify that this is a DLL, we will need to select “Dynamic-Link Library with exports (DLL)”

After selecting a name for our project and a save location. We go ahead and open the “Header Files” folder that was generated ([ProjectName].h file):

The header file will be used to declare all our classes and functions. First, we define a C++ macro that exports the functions for third-party applications (Unity) that are going to be using the DLL to access functions and classes. This block is called conditional group.

We can remove the class and function examples since we will be writing our own functions for testing.

We create three simple functions. The first one displays a number, the second one displays a random number and the third one adds two numbers.

Please note that we are using extern “C” to avoid Name mangling as discussed above.

In our Solution Explorer, open the [ProjectName.cpp] file:

Now that we have our test functions. Let us Build our solution, but before, we need to make sure that we are building it to the correct expected 64-bit architecture. We need to compile our libraries for x64 platform (64-bit). To change this in Visual Studio, we can go to the Configuration Manager, then select x64 under “Platform”. Or simply select x64 from the drop-down menu at the top.

Our Solution builds successfully

To easily access the generated DLLs, right click on your Solution in the Solution Explorer and select “Open folder in File Explorer”

Conclusion

This article aims to provide an easy to follow example on how to create a Dynamic Link Library. In the next article, we will discuss how we can use this library from a third party software such as Unity3D to find a simple technique to integrate existing C/C++ code in Unity3D. Allowing us to use plugins to access already existing C/C++ methods and classes directly from our C# Unity script.

Программирование на C, C# и Java

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode

Как создать dll в Visual Studio

DLL (Dynamic Link Library) — динамически подключаемая библиотека функций. Для библиотек DLL предполагается многократное использование различными программами. Поговорим о том, как создать библиотеку DLL в Visual Studio, используя языки программирования C и C#.

Создание dll на языке Си

Создаем в Visual Studio новый проект — консольное приложение.

Создаем в Visual Studio новый проект - vscode.ru

В запустившемся «Мастере приложений Win32» жмем кнопку «Далее». В следующем окне выбираем тип приложения: «Библиотека DLL»; также ставим галочку напротив параметра «Пустой проект». Жмем кнопку «Готово».

Похожие статьи