Меню Рубрики

Установка dll visual studio

Создание C/C++ DLL в Visual Studio Create C/C++ DLLs in Visual Studio

В Windows библиотека динамической компоновки (DLL) — это разновидность исполняемого файла, который выступает в качестве общей библиотеки функций и ресурсов. In Windows, a dynamic-link library (DLL) is a kind of executable file that acts as a shared library of functions and resources. Динамическая компоновка — это возможность операционной системы. Dynamic linking is an operating system capability. Он позволяет исполняемому файлу вызывать функции или использовать ресурсы, хранящиеся в отдельном файле. It enables an executable to call functions or use resources stored in a separate file. Эти функции и ресурсы можно компилировать и развертывать отдельно от использующих их исполняемых файлов. These functions and resources can be compiled and deployed separately from the executables that use them.

Библиотека DLL не является изолированным исполняемым файлом. A DLL isn’t a stand-alone executable. Библиотеки DLL выполняются в контексте приложений, которые их вызывают. DLLs run in the context of the applications that call them. Операционная система загружает библиотеку DLL в область памяти приложения. The operating system loads the DLL into an application’s memory space. Это делается при загрузке приложения (неявное связывание) или по запросу во время выполнения (явная компоновка). It’s done either when the application is loaded (implicit linking), or on demand at runtime (explicit linking). Библиотеки DLL также упрощают совместное использование функций и ресурсов различными исполняемыми файлами. DLLs also make it easy to share functions and resources across executables. Несколько приложений могут осуществлять одновременный доступ к содержимому одной копии библиотеки DLL в памяти. Multiple applications can access the contents of a single copy of a DLL in memory at the same time.

Различия между динамической компоновкой и статической компоновкой Differences between dynamic linking and static linking

Статическая компоновка копирует весь объектный код в статическую библиотеку в исполняемые объекты, использующие его при построении. Static linking copies all the object code in a static library into the executables that use it when they’re built. Динамическая компоновка включает только сведения, необходимые Windows во время выполнения для нахождение и загрузки библиотеки DLL, содержащей элемент данных или функцию. Dynamic linking includes only the information needed by Windows at run time to locate and load the DLL that contains a data item or function. При создании библиотеки DLL также создается библиотека импорта, содержащая эти сведения. When you create a DLL, you also create an import library that contains this information. При создании исполняемого файла, вызывающего библиотеку DLL, компоновщик использует экспортированные символы в библиотеке импорта для хранения этих сведений для загрузчика Windows. When you build an executable that calls the DLL, the linker uses the exported symbols in the import library to store this information for the Windows loader. Когда загрузчик загружает библиотеку DLL, Библиотека DLL сопоставляется с областью памяти приложения. When the loader loads a DLL, the DLL is mapped into the memory space of your application. При наличии специальной функции в библиотеке DLL, DllMain , вызывается для инициализации библиотеки DLL. If present, a special function in the DLL, DllMain , is called to do any initialization the DLL requires.

Различия между приложениями и библиотеками DLL Differences between applications and DLLs

Несмотря на то что библиотеки DLL и приложения являются исполняемыми модулями, они отличаются несколькими способами. Even though DLLs and applications are both executable modules, they differ in several ways. Наиболее очевидная разница заключается в том, что невозможно запустить библиотеку DLL. The most obvious difference is that you can’t run a DLL. С точки зрения системы существует два фундаментальных различия между приложениями и библиотеками DLL: From the system’s point of view, there are two fundamental differences between applications and DLLs:

Приложение может одновременно работать в системе нескольких экземпляров. An application can have multiple instances of itself running in the system simultaneously. Библиотека DLL может иметь только один экземпляр. A DLL can have only one instance.

Приложение может быть загружено как процесс. An application can be loaded as a process. Она может выполнять такие задачи, как стек, потоки выполнения, глобальная память, дескрипторы файлов и очередь сообщений. It can own things such as a stack, threads of execution, global memory, file handles, and a message queue. Библиотека DLL не может владеть этими объектами. A DLL can’t own these things.

Преимущества использования библиотек DLL Advantages of using DLLs

Динамическая компоновка с кодом и ресурсами обеспечивает ряд преимуществ по сравнению со статической компоновкой. Dynamic linking to code and resources offers several advantages over static linking:

Динамическая компоновка экономит память и сокращает подкачку. Dynamic linking saves memory and reduces swapping. Многие процессы могут использовать библиотеку DLL одновременно, совместно используя одну копию частей библиотеки DLL, предназначенных только для чтения, в памяти. Many processes can use a DLL simultaneously, sharing a single copy of the read-only parts of a DLL in memory. В отличие от этого, каждое приложение, созданное с помощью статической библиотеки, имеет полную копию кода библиотеки, которую Windows должна загрузить в память. In contrast, every application that is built by using a statically linked library has a complete copy of the library code that Windows must load into memory.

Динамическая компоновка экономит место на диске и пропускную способность. Dynamic linking saves disk space and bandwidth. Многие приложения могут совместно использовать одну копию библиотеки DLL на диске. Many applications can share a single copy of the DLL on disk. Напротив, каждое приложение, созданное с помощью статической библиотеки ссылок, имеет код библиотеки, связанный с исполняемым образом. In contrast, each application built by using a static link library has the library code linked into its executable image. При этом используется больше места на диске, а для передачи — дополнительная пропускная способность. That uses more disk space, and takes more bandwidth to transfer.

Обслуживание, исправления безопасности и обновления могут быть проще. Maintenance, security fixes, and upgrades can be easier. Если приложения используют общие функции в библиотеке DLL, можно реализовать исправления ошибок и развернуть обновления в библиотеке DLL. When your applications use common functions in a DLL, you can implement bug fixes and deploy updates to the DLL. При обновлении библиотек DLL приложения, использующие их, не нуждаются в повторной компиляции или повторной компоновке. When DLLs are updated, the applications that use them don’t need to be recompiled or relinked. Они могут использовать новую библиотеку DLL сразу после развертывания. They can make use of the new DLL as soon as it’s deployed. В отличие от этого, при внесении исправлений в статически связываемый объектный код необходимо повторно связать и повторно развернуть каждое приложение, которое его использует. In contrast, when you make fixes in statically linked object code, you must relink and redeploy every application that uses it.

Вы можете использовать библиотеки DLL для предоставления поддержки по окончании рынка. You can use DLLs to provide after-market support. Например, библиотеку DLL видеодрайверов можно изменить для поддержки экрана, который не был доступен при отгрузке приложения. For example, a display driver DLL can be modified to support a display that wasn’t available when the application was shipped.

Вы можете использовать явную связь для обнаружения и загрузки библиотек DLL во время выполнения. You can use explicit linking to discover and load DLLs at runtime. Например, расширения приложений, которые добавляют в приложение новые функциональные возможности без перестроения или повторного развертывания. For example, application extensions that add new functionality to your app without rebuilding or redeploying it.

Динамическая компоновка упрощает поддержку приложений, написанных на разных языках программирования. Dynamic linking makes it easier to support applications written in different programming languages. Программы, написанные на разных языках программирования, могут вызывать одну и ту же функцию DLL, если программы следуют соглашению о вызовах функции. Programs written in different programming languages can call the same DLL function as long as the programs follow the function’s calling convention. Программы и функции DLL должны быть совместимы следующими способами: порядок, в котором функция требует, чтобы ее аргументы были помещены в стек. The programs and the DLL function must be compatible in the following ways: The order in which the function expects its arguments to be pushed onto the stack. Несет ли функция или приложение ответственность за очистку стека. Whether the function or the application is responsible for cleaning up the stack. И указывает, передаются ли аргументы в регистры. And, whether any arguments are passed in registers.

Динамическая компоновка предоставляет механизм для расширения классов библиотеки Microsoft Foundation Class (MFC). Dynamic linking provides a mechanism to extend the Microsoft Foundation Class library (MFC) classes. Можно наследовать классы из существующих классов MFC и поместить их в библиотеку DLL расширения MFC для использования приложениями MFC. You can derive classes from the existing MFC classes and place them in an MFC extension DLL for use by MFC applications.

Динамическая компоновка упрощает создание международных версий приложения. Dynamic linking makes creation of international versions of your application easier. Библиотеки DLL — это удобный способ предоставления ресурсов, зависящих от языкового стандарта, что значительно упрощает создание международных версий приложения. DLLs are a convenient way to supply locale-specific resources, which make it much easier to create international versions of an application. Вместо того чтобы доставлять несколько локализованных версий приложения, можно разместить строки и изображения для каждого языка в отдельной библиотеке DLL ресурсов. Instead of shipping many localized versions of your application, you can place the strings and images for each language in a separate resource DLL. Затем приложение может загрузить соответствующие ресурсы для этого языкового стандарта во время выполнения. Then your application can load the appropriate resources for that locale at runtime.

Потенциальные недостатки использования библиотек DLL в том, что приложение не является автономным. A potential disadvantage to using DLLs is that the application isn’t self-contained. Это зависит от существования отдельного модуля DLL: один из них необходимо развернуть или проверить в рамках установки. It depends on the existence of a separate DLL module: one that you must deploy or verify yourself as part of your installation.

Дополнительные сведения о создании и использовании библиотек DLL More information on how to create and use DLLs

В следующих статьях содержатся подробные сведения о создании C/C++ DLL в Visual Studio. The following articles provide detailed information about how to create C/C++ DLLs in Visual Studio.

Пошаговое руководство. Создание и использование библиотеки динамическойC++компоновки () Walkthrough: Creating and using a dynamic link library (C++)
Описывает создание и использование библиотек DLL при помощи Visual Studio. Describes how to create and use a DLL using Visual Studio.

Типы библиотек dll Kinds of DLLs
Предоставляет сведения о различных типах библиотек DLL, которые доступны для сборки. Provides information about the different kinds of DLLs that can be built.

Часто задаваемые вопросы о библиотеке DLL DLL frequently asked questions
Ответы на часто задаваемые вопросы о библиотеках DLL. Provides answers to frequently asked questions about DLLs.

Связывание исполняемого файла с библиотекой DLL Link an executable to a DLL
Описание явного и неявного соединения с библиотекой DLL. Describes explicit and implicit linking to a DLL.

Инициализация библиотеки DLL Initialize a DLL
Описывает код инициализации DLL, который должен выполняться при загрузке библиотеки DLL. Discusses DLL initialization code that must execute when your DLL loads.

Библиотеки DLL и C++ визуальное поведение библиотеки времени выполнения DLLs and Visual C++ run-time library behavior
Описывает последовательность запуска DLL библиотеки времени выполнения. Describes the run-time library DLL startup sequence.

LoadLibrary и афкслоадлибрари LoadLibrary and AfxLoadLibrary
Обсуждается использование LoadLibrary и AfxLoadLibrary для явной компоновки библиотеки DLL во время выполнения. Discusses using LoadLibrary and AfxLoadLibrary to explicitly link to a DLL at runtime.

\ GetProcAddress GetProcAddress Обсуждается использование GetProcAddress для получения адреса экспортированной функции в библиотеке DLL. Discusses using GetProcAddress to obtain the address of an exported function in the DLL.

\ FreeLibrary и AfxFreeLibrary FreeLibrary and AfxFreeLibrary Обсуждается использование FreeLibrary и AfxFreeLibrary , когда модуль DLL больше не нужен. Discusses using FreeLibrary and AfxFreeLibrary when the DLL module is no longer needed.

\ Порядок поиска библиотеки динамической компоновки Dynamic-Link Library Search Order Описание пути поиска, который операционная система Windows использует для поиска библиотеки DLL в системе. Describes the search path that the Windows operating system uses to locate a DLL on the system.

Состояния модулей обычной библиотеки DLL MFC, динамически связываемые с MFC Module states of a regular MFC DLL dynamically linked to MFC
Описывает состояния модулей обычной библиотеки DLL MFC, динамически связываемые с MFC. Describes the module states of a regular MFC DLL dynamically linked to MFC.

Библиотеки DLL расширения MFC MFC extension DLLs
Описывает библиотеки DLL, которые обычно реализуют многократно используемые классы, производные от существующих классов MFC. Explains DLLs that typically implement reusable classes derived from the existing MFC classes.

Создание библиотеки DLL только для ресурсов Creating a resource-only DLL
Библиотека DLL, содержащая только ресурсы, например значки, растровые изображения, строки и диалоговые окна. Discusses a resource-only DLL, which contains nothing but resources, such as icons, bitmaps, strings, and dialog boxes.

Локализованные ресурсы в приложениях MFC: вспомогательные библиотеки dll Localized resources in MFC Applications: Satellite DLLs
Расширенная поддержка библиотек спутниковой связи DLL и содержит возможность, которая позволяет создавать приложения, локализированные на различные языки. Provides enhanced support for satellite DLLs, a feature that helps in creating applications localized for multiple languages.

Импорт и экспорт Importing and exporting
Импортирование открытых символов в приложение или экспортирование функций из библиотеки DLL Describes importing public symbols into an application or exporting functions from a DLL

Активные технологии и библиотеки dll Active technology and DLLs
Размещение серверов объектов внутри библиотеки DLL. Allows object servers to be implemented inside a DLL.

Автоматизация в библиотеке DLL Automation in a DLL
Параметр автоматизации в решениях мастера библиотек DLL MFC. Describes what the Automation option in the MFC DLL Wizard supplies.

Соглашения об именовании для библиотек DLL MFC Naming conventions for MFC DLLs
Способ встраивания библиотек DLL в MFC, опираясь на четко структурированное соглашение об именовании. Discusses how the DLLs and libraries included in MFC follow a structured naming convention.

Вызов функций DLL из Visual Basic приложений Calling DLL functions from Visual Basic applications
Способ вызова функций DLL из приложений Visual Basic. Describes how to call DLL functions from Visual Basic applications.

См. также Related Sections

Использование MFC в составе библиотеки DLL Using MFC as part of a DLL
Описывает регулярные библиотеки DLL MFC, которые позволяют использовать библиотеку MFC в составе библиотеки динамической компоновки Windows. Describes regular MFC DLLs, which let you use the MFC library as part of a Windows dynamic-link library.

источник

Пошаговое руководство. Создание и использование собственной библиотеки динамическойC++компоновки () Walkthrough: Create and use your own Dynamic Link Library (C++)

В этом пошаговом руководстве показано, как использовать интегрированную среду разработки Visual Studio для создания собственной библиотеки динамической компоновки (DLL), написанной C++ в Microsoft (компилятором MSVC). This step-by-step walkthrough shows how to use the Visual Studio IDE to create your own dynamic link library (DLL) written in Microsoft C++ (MSVC). Затем показано, как использовать библиотеку DLL из другого C++ приложения. Then it shows how to use the DLL from another C++ app. Библиотеки DLL (также называемые общими библиотеками в операционных системах на основе UNIX) являются одним из наиболее полезных типов компонентов Windows. DLLs (also known as shared libraries in UNIX-based operating systems) are one of the most useful kinds of Windows components. Их можно использовать в качестве способа совместного использования кода и ресурсов, а также для уменьшения размера приложений. You can use them as a way to share code and resources, and to shrink the size of your apps. Библиотеки DLL могут упростить обслуживание и расширение приложений. DLLs can even make it easier to service and extend your apps.

Читайте также:  Установка aps на гранту

В этом пошаговом руководстве вы создадите библиотеку DLL, которая реализует некоторые математические функции. In this walkthrough, you’ll create a DLL that implements some math functions. Затем вы создадите консольное приложение, использующее функции из библиотеки DLL. Then you’ll create a console app that uses the functions from the DLL. Вы также получите введение в некоторые приемы программирования и соглашения, используемые в библиотеках DLL Windows. You’ll also get an introduction to some of the programming techniques and conventions used in Windows DLLs.

В этом пошаговом руководстве рассматриваются следующие задачи: This walkthrough covers these tasks:

Создание проекта библиотеки DLL в Visual Studio. Create a DLL project in Visual Studio.

Добавление экспортированных функций и переменных в библиотеку DLL. Add exported functions and variables to the DLL.

Создание проекта «Консольное приложение» в Visual Studio. Create a console app project in Visual Studio.

Использование в консольном приложении функций и переменных, импортированных из библиотеки DLL. Use the functions and variables imported from the DLL in the console app.

Запуск готового приложения. Run the completed app.

Как и в случае со статически связанной библиотекой, Библиотека DLL экспортирует переменные, функции и ресурсы по имени. Like a statically linked library, a DLL exports variables, functions, and resources by name. Клиентское приложение импортирует имена для использования этих переменных, функций и ресурсов. A client app imports the names to use those variables, functions, and resources. В отличие от статически компонуемой библиотеки, Windows соединяет импорт в вашем приложении с экспортом в библиотеку DLL во время загрузки или выполнения, а не во время компоновки. Unlike a statically linked library, Windows connects the imports in your app to the exports in a DLL at load time or at run time, instead of connecting them at link time. Для выполнения этих подключений Windows требуются дополнительные сведения, которые не являются частью стандартной модели компиляции C++. Windows requires extra information that isn’t part of the standard C++ compilation model to make these connections. Чтобы предоставить эти дополнительные сведения, компилятор MSVC реализует некоторые специальные расширения Майкрософт для C++. The MSVC compiler implements some Microsoft-specific extensions to C++ to provide this extra information. Мы рассмотрим эти расширения далее. We explain these extensions as we go.

В этом пошаговом руководстве создаются два решения Visual Studio. Первое решение создает библиотеку DLL, а второе — клиентское приложение. This walkthrough creates two Visual Studio solutions; one that builds the DLL, and one that builds the client app. Библиотека DLL использует соглашение о вызовах C. The DLL uses the C calling convention. Его можно вызывать из приложений, написанных на других языках программирования, при условии, что платформа, соглашения о вызовах и соглашения о связывании совпадают. It can be called from apps written in other programming languages, as long as the platform, calling conventions, and linking conventions match. Клиентское приложение использует неявную компоновку, в рамках которой Windows связывает приложение с библиотекой DLL во время загрузки. The client app uses implicit linking, where Windows links the app to the DLL at load-time. Эта компоновка позволяет приложению вызывать функции, предоставляемые библиотекой DLL, точно так же, как функции в библиотеке статической компоновки. This linking lets the app call the DLL-supplied functions just like the functions in a statically linked library.

В этом пошаговом руководстве не рассматриваются некоторые общие ситуации. This walkthrough doesn’t cover some common situations. Код не показывает использование C++ библиотек DLL другими языками программирования. The code doesn’t show the use of C++ DLLs by other programming languages. Он не показывает, как создать библиотеку DLL с ресурсамиили использовать явную компоновку для загрузки библиотек DLL во время выполнения, а не во время загрузки. It doesn’t show how to create a resource-only DLL, or how to use explicit linking to load DLLs at run-time rather than at load-time. Если вы уверены, вы можете использовать КОМПИЛЯТОРОМ MSVC и Visual Studio, чтобы выполнить все эти действия. Rest assured, you can use MSVC and Visual Studio to do all these things.

Ссылки на дополнительные сведения о DLL см. в статье Создание библиотек DLL на C/C++ в Visual Studio. For links to more information about DLLs, see Create C/C++ DLLs in Visual Studio. Дополнительные сведения о неявной компоновке и явной компоновке см. в разделе Определение используемого метода связывания. For more information about implicit linking and explicit linking, see Determine which linking method to use. Сведения о создании C++ библиотек DLL для использования с языками программирования, использующими соглашения о компоновках c-Language, см. в разделе Экспорт C++ функций для использования в исполняемых файлах языка c. For information about creating C++ DLLs for use with programming languages that use C-language linkage conventions, see Exporting C++ functions for use in C-language executables. Дополнительные сведения о том, как создавать библиотеки DLL для использования с языками .NET, см. в статье Вызов функций библиотек DLL из приложений Visual Basic. For information about how to create DLLs for use with .NET languages, see Calling DLL Functions from Visual Basic Applications.

предварительные требования Prerequisites

  • Компьютер под управлением Microsoft Windows 7 или более поздних версий. A computer that runs Microsoft Windows 7 or later versions. Для обеспечения оптимальной среды разработки рекомендуется использовать Windows 10. We recommend Windows 10 for the best development experience.

Копия Visual Studio. A copy of Visual Studio. Сведения о скачивании и установке Visual Studio см. в этой статье. For information on how to download and install Visual Studio, see Install Visual Studio. Когда вы запускаете установщик, убедитесь, что установлена рабочая нагрузка Разработка классических приложений на C++ . When you run the installer, make sure that the Desktop development with C++ workload is checked. Не беспокойтесь, если вы не установили эту рабочую нагрузку при установке Visual Studio. Don’t worry if you didn’t install this workload when you installed Visual Studio. Вы можете снова запустить установщик и установить ее сейчас. You can run the installer again and install it now.

  • Копия Visual Studio. A copy of Visual Studio. Сведения о том, как скачать и установить Visual Studio 2015, см. в статье Установка Visual studio 2015. For information on how to download and install Visual Studio 2015, see Install Visual Studio 2015. Используйте выборочную установку для установки C++ компилятора и средств, так как они не устанавливаются по умолчанию. Use a Custom installation to install the C++ compiler and tools, since they’re not installed by default.

Базовые значения об использовании интегрированной среды разработки Visual Studio. An understanding of the basics of using the Visual Studio IDE. Если вы уже использовали классические приложения для Windows, вы, вероятно, справитесь. If you’ve used Windows desktop apps before, you can probably keep up. Общие сведения см. в обзоре возможностей интегрированной среды разработки Visual Studio. For an introduction, see Visual Studio IDE feature tour.

Основные навыки владения языком C++. An understanding of enough of the fundamentals of the C++ language to follow along. Не волнуйтесь, мы не будем делать ничего сложного. Don’t worry, we don’t do anything too complicated.

В этом пошаговом руководстве предполагается, что вы используете Visual Studio 2017 версии 15,9 или более поздней. This walkthrough assumes you’re using Visual Studio 2017 version 15.9 or later. Некоторые более ранние версии Visual Studio 2017 имели дефекты в шаблонах кода или использовали разные диалоговые окна пользовательского интерфейса. Some earlier versions of Visual Studio 2017 had defects in the code templates, or used different user interface dialogs. Чтобы избежать проблем, используйте Visual Studio Installer для обновления Visual Studio 2017 до версии 15,9 или более поздней. To avoid problems, use the Visual Studio Installer to update Visual Studio 2017 to version 15.9 or later.

Создание проекта библиотеки DLL Create the DLL project

Этот набор задач позволяет создать проект для библиотеки DLL, добавить код и выполнить его сборку. In this set of tasks, you create a project for your DLL, add code, and build it. Для начала запустите IDE Visual Studio и выполните вход, если это необходимо. To begin, start the Visual Studio IDE, and sign in if you need to. Эти инструкции немного различаются в зависимости от используемой версии Visual Studio. The instructions vary slightly depending on which version of Visual Studio you’re using. Убедитесь, что в элементе управления в верхнем левом углу этой страницы выбрана правильная версия. Make sure you have the correct version selected in the control in the upper left of this page.

Создание проекта библиотеки DLL в Visual Studio 2019 To create a DLL project in Visual Studio 2019

В строке меню последовательно выберите файл > создать > проект , чтобы открыть диалоговое окно Создание нового проекта . On the menu bar, choose File > New > Project to open the Create a New Project dialog box.

В верхней части диалогового окна для параметра Язык установите значение C++ , для параметра Платформа — значение Windows, а для параметра Тип проекта — значение Библиотека. At the top of the dialog, set Language to C++, set Platform to Windows, and set Project type to Library.

В отфильтрованном списке типов проектов выберите Библиотека динамической компоновки (DLL) , а затем нажмите кнопку Далее. From the filtered list of project types, select Dynamic-link Library (DLL), and then choose Next.

На странице Настройка нового проекта введите маслибрари в поле имя проекта , чтобы указать имя проекта. In the Configure your new project page, enter MathLibrary in the Project name box to specify a name for the project. Оставьте значения расположения и имени решения по умолчанию. Leave the default Location and Solution name values. Задайте решение для создания нового решения. Set Solution to Create new solution. Снимите флажок размещать решение и проект в том же каталоге, если он установлен. Uncheck Place solution and project in the same directory if it’s checked.

Нажмите кнопку Создать, чтобы создать проект. Choose the Create button to create the project.

После создания решения можно просмотреть созданный проект и исходные файлы в окне Обозреватель решений в Visual Studio. When the solution is created, you can see the generated project and source files in the Solution Explorer window in Visual Studio.

Создание проекта библиотеки DLL в Visual Studio 2017 To create a DLL project in Visual Studio 2017

В строке меню последовательно выберите файл > создать > проект , чтобы открыть диалоговое окно Создание проекта . On the menu bar, choose File > New > Project to open the New Project dialog box.

В левой области диалогового окна Новый проект выберите установлено > Visual C++ > Рабочий стол Windows. In the left pane of the New Project dialog box, select Installed > Visual C++ > Windows Desktop. В центральной области выберите Библиотека динамической компоновки (DLL) . In the center pane, select Dynamic-Link Library (DLL). Введите маслибрари в поле имя , чтобы указать имя проекта. Enter MathLibrary in the Name box to specify a name for the project. Оставьте значения расположения и имени решения по умолчанию. Leave the default Location and Solution name values. Задайте решение для создания нового решения. Set Solution to Create new solution. Установите флажок создать каталог для решения , если он не установлен. Check Create directory for solution if it’s unchecked.

Нажмите кнопку ОК, чтобы создать проект. Choose the OK button to create the project.

После создания решения можно просмотреть созданный проект и исходные файлы в окне Обозреватель решений в Visual Studio. When the solution is created, you can see the generated project and source files in the Solution Explorer window in Visual Studio.

Создание проекта DLL в Visual Studio 2015 и более ранних версий To create a DLL project in Visual Studio 2015 and older versions

В строке меню щелкните Файл > Создать > Проект. On the menu bar, choose File > New > Project.

В левой области диалогового окна Новый проект разверните узлы Установленные > Шаблоны и выберите Visual C++ , а затем в центральной области щелкните Консольное приложение Win32. In the left pane of the New Project dialog box, expand Installed > Templates, and select Visual C++, and then in the center pane, select Win32 Console Application. Введите маслибрари в поле ввода имя , чтобы указать имя проекта. Enter MathLibrary in the Name edit box to specify a name for the project. Оставьте значения расположения и имени решения по умолчанию. Leave the default Location and Solution name values. Задайте решение для создания нового решения. Set Solution to Create new solution. Установите флажок создать каталог для решения , если он не установлен. Check Create directory for solution if it’s unchecked.

Нажмите кнопку ​​ОК, чтобы закрыть диалоговое окно Новый проект, и запустите мастер приложений Win32. Choose the OK button to dismiss the New Project dialog and start the Win32 Application Wizard.

Нажмите кнопку Далее. Choose the Next button. На странице Параметры приложения в поле Тип приложения выберите пункт DLL. On the Application Settings page, under Application type, select DLL.

Нажмите кнопку Готово , чтобы создать проект. Choose the Finish button to create the project.

Когда мастер завершит создание решения, вы сможете увидеть созданный проект вместе с исходными файлами в окне обозревателя решений в Visual Studio. When the wizard completes the solution, you can see the generated project and source files in the Solution Explorer window in Visual Studio.

Пока эта библиотека DLL ничего не делает. Right now, this DLL doesn’t do very much. Далее предстоит создать файл заголовка для объявления функций, экспортируемых библиотекой DLL, а затем добавить определения функций в библиотеку DLL, чтобы сделать ее более полезной. Next, you’ll create a header file to declare the functions your DLL exports, and then add the function definitions to the DLL to make it more useful.

Добавление файла заголовка в библиотеку DLL To add a header file to the DLL

Чтобы создать файл заголовка для функций, последовательно щелкните Проект > Добавить новый элемент. To create a header file for your functions, on the menu bar, choose Project > Add New Item.

В диалоговом окне Добавление нового элемента в левой области щелкните Visual C++ . In the Add New Item dialog box, in the left pane, select Visual C++. В центральной области выберите Заголовочный файл (.h) . In the center pane, select Header File (.h). Укажите маслибрари. h в качестве имени файла заголовка. Specify MathLibrary.h as the name for the header file.

Читайте также:  Установки параметров страницы ее ориентации

![Добавить заголовок в диалоговом окне «Добавление нового элемента»](media/mathlibrary-add-new-item-header-file.png «Добавить заголовочный файл в диалоговом окне «Добавление нового элемента»»)

Нажмите кнопку ​​Добавить, чтобы создать пустой файл заголовка, который отображается в новом окне редактора. Choose the Add button to generate a blank header file, which is displayed in a new editor window.

Замените все содержимое этого файла заголовка следующим кодом: Replace the contents of the header file with this code:

Этот файл заголовка объявляет некоторые функции для создания обобщенной последовательности Фибоначчи, исходя из двух начальных значений. This header file declares some functions to produce a generalized Fibonacci sequence, given two initial values. Вызов fibonacci_init(1, 1) создает знакомую последовательность чисел Фибоначчи. A call to fibonacci_init(1, 1) generates the familiar Fibonacci number sequence.

Обратите внимание на операторы препроцессора в верхней части файла. Notice the preprocessor statements at the top of the file. Новый шаблон проекта для проекта DLL добавляет экспорты имяПроекта_ в определенные макросы препроцессора. The new project template for a DLL project adds PROJECTNAME_EXPORTS to the defined preprocessor macros. В этом примере Visual Studio определяет MATHLIBRARY_EXPORTS при сборке проекта библиотеки DLL MathLibrary. In this example, Visual Studio defines MATHLIBRARY_EXPORTS when your MathLibrary DLL project is built.

Когда макрос MATHLIBRARY_EXPORTS определен, макрос MATHLIBRARY_API устанавливает модификатор __declspec(dllexport) в объявлениях функций. When the MATHLIBRARY_EXPORTS macro is defined, the MATHLIBRARY_API macro sets the __declspec(dllexport) modifier on the function declarations. Этот модификатор указывает компилятору и компоновщику экспортировать функцию или переменную из библиотеки DLL для использования другими приложениями. This modifier tells the compiler and linker to export a function or variable from the DLL for use by other applications. Если MATHLIBRARY_EXPORTS не определен, например, когда файл заголовка включен клиентским приложением, MATHLIBRARY_API применяет модификатор __declspec(dllimport) к объявлениям. When MATHLIBRARY_EXPORTS is undefined, for example, when the header file is included by a client application, MATHLIBRARY_API applies the __declspec(dllimport) modifier to the declarations. Этот модификатор оптимизирует импорт функции или переменной в приложении. This modifier optimizes the import of the function or variable in an application. Дополнительные сведения см. в статье dllexport, dllimport. For more information, see dllexport, dllimport.

Добавление реализации в библиотеку DLL To add an implementation to the DLL

В Обозреватель решенийщелкните правой кнопкой мыши узел исходные файлы и выберите команду добавить > новый элемент. In Solution Explorer, right-click on the Source Files node and choose Add > New Item. Создайте новый CPP-файл с именем маслибрари. cpp, аналогично добавлению нового файла заголовка на предыдущем шаге. Create a new .cpp file called MathLibrary.cpp, in the same way that you added a new header file in the previous step.

В окне редактора выберите вкладку MathLibrary.cpp, если она уже открыта. In the editor window, select the tab for MathLibrary.cpp if it’s already open. Если нет, в Обозреватель решенийдважды щелкните маслибрари. cpp в папке исходных файлов проекта маслибрари , чтобы открыть его. If not, in Solution Explorer, double-click MathLibrary.cpp in the Source Files folder of the MathLibrary project to open it.

В редакторе замените содержимое файла MathLibrary.cpp следующим кодом: In the editor, replace the contents of the MathLibrary.cpp file with the following code:

В окне редактора выберите вкладку MathLibrary.cpp, если она уже открыта. In the editor window, select the tab for MathLibrary.cpp if it’s already open. Если нет, в Обозреватель решенийдважды щелкните маслибрари. cpp в папке исходных файлов проекта маслибрари , чтобы открыть его. If not, in Solution Explorer, double-click MathLibrary.cpp in the Source Files folder of the MathLibrary project to open it.

В редакторе замените содержимое файла MathLibrary.cpp следующим кодом: In the editor, replace the contents of the MathLibrary.cpp file with the following code:

Чтобы убедиться, что все работает, скомпилируйте библиотеку динамической компоновки. To verify that everything works so far, compile the dynamic link library. Чтобы выполнить компиляцию, последовательно выберите Сборка > Собрать решение. To compile, choose Build > Build Solution on the menu bar. Библиотека DLL и связанные выходные данные компилятора помещаются в папку с именем Отладка непосредственно под папкой решения. The DLL and related compiler output are placed in a folder called Debug directly below the solution folder. При создании сборки выпуска выходные данные помещаются в папку с именем Release. If you create a Release build, the output is placed in a folder called Release. Результат должен выглядеть следующим образом. The output should look something like this:

Поздравляем, вы создали библиотеку DLL с помощью Visual Studio! Congratulations, you’ve created a DLL using Visual Studio! Далее вы создадите клиентское приложение, которое использует функции, экспортируемые из библиотеки DLL. Next, you’ll create a client app that uses the functions exported by the DLL.

Создание клиентского приложения, которое использует библиотеку DLL Create a client app that uses the DLL

При создании библиотеки DLL Подумайте о том, как клиентские приложения могут его использовать. When you create a DLL, think about how client apps may use it. Чтобы вызвать функции или получить доступ к данным, экспортированным библиотекой DLL, исходный код клиента должен иметь объявления, доступные во время компиляции. To call the functions or access the data exported by a DLL, client source code must have the declarations available at compile time. Во время компоновки компоновщику требуются сведения для разрешения вызовов функций или доступа к данным. At link time, the linker requires information to resolve the function calls or data accesses. Библиотека DLL предоставляет эти сведения в библиотеке импорта— файле, который содержит сведения о поиске функций и данных вместо фактического кода. A DLL supplies this information in an import library, a file that contains information about how to find the functions and data, instead of the actual code. Во время выполнения библиотека DLL должна быть доступна клиенту в месте, которое может найти операционная система. And at run time, the DLL must be available to the client, in a location that the operating system can find.

Независимо от того, являетесь ли оно собственным или сторонним разработчиком, вашему проекту клиентского приложения требуется несколько фрагментов информации для использования библиотеки DLL. Whether it’s your own or from a third-party, your client app project needs several pieces of information to use a DLL. Ему необходимо найти заголовки, в которых объявляются экспорты DLL, библиотеки импорта для компоновщика и саму библиотеку DLL. It needs to find the headers that declare the DLL exports, the import libraries for the linker, and the DLL itself. Одним из решений является копирование всех этих файлов в клиентский проект. One solution is to copy all of these files into your client project. Для сторонних библиотек DLL, которые вряд ли изменятся во время разработки вашего клиента, этот метод может быть лучшим способом их использования. For third-party DLLs that are unlikely to change while your client is in development, this method may be the best way to use them. Однако, когда вы также создаете библиотеку DLL, лучше избегать дублирования. However, when you also build the DLL, it’s better to avoid duplication. Если создать локальную копию DLL-файлов, находящихся под разработкой, вы можете случайно изменить файл заголовка в одной копии, но не в другом, или использовать устаревшую библиотеку. If you make a local copy of DLL files that are under development, you may accidentally change a header file in one copy but not the other, or use an out-of-date library.

Чтобы избежать несинхронизированного кода, мы рекомендуем задать путь включения в проекте клиента, чтобы включить файлы заголовков DLL непосредственно из проекта DLL. To avoid out-of-sync code, we recommend you set the include path in your client project to include the DLL header files directly from your DLL project. Кроме того, укажите путь к библиотеке в своем клиентском проекте, чтобы добавить библиотеки импорта DLL из проекта DLL. Also, set the library path in your client project to include the DLL import libraries from the DLL project. И, наконец, скопируйте сборку DLL из проекта DLL в выходной каталог сборки клиента. And finally, copy the built DLL from the DLL project into your client build output directory. Этот шаг позволяет вашему клиентскому приложению использовать тот же код библиотеки DLL, который вы создали. This step allows your client app to use the same DLL code you build.

Создание клиентского приложения в Visual Studio To create a client app in Visual Studio

В строке меню последовательно выберите файл > создать > проект , чтобы открыть диалоговое окно Создание нового проекта . On the menu bar, choose File > New > Project to open the Create a new project dialog box.

В верхней части диалогового окна для параметра Язык выберите значение C++ , для параметра Платформа — значение Windows, а для параметра Тип проекта — значение Консоль. At the top of the dialog, set Language to C++, set Platform to Windows, and set Project type to Console.

В отфильтрованном списке типов проектов щелкните Консольное приложение, а затем нажмите кнопку Далее. From the filtered list of project types, choose Console App then choose Next.

На странице Настройка нового проекта введите масклиент в поле имя проекта , чтобы указать имя проекта. In the Configure your new project page, enter MathClient in the Project name box to specify a name for the project. Оставьте значения расположения и имени решения по умолчанию. Leave the default Location and Solution name values. Задайте решение для создания нового решения. Set Solution to Create new solution. Снимите флажок размещать решение и проект в том же каталоге, если он установлен. Uncheck Place solution and project in the same directory if it’s checked.

Нажмите кнопку Создать, чтобы создать клиентский проект. Choose the Create button to create the client project.

Для вас создается минимальный проект консольного приложения. A minimal console application project is created for you. Имя главного исходного файла будет совпадать с ранее введенным именем проекта. The name for the main source file is the same as the project name that you entered earlier. В этом примере используется имя MathClient.cpp. In this example, it’s named MathClient.cpp. Вы можете создать проект, но он еще не использует вашу библиотеку DLL. You can build it, but it doesn’t use your DLL yet.

Создание клиентского приложения в Visual Studio 2017 To create a client app in Visual Studio 2017

Чтобы C++ создать приложение, использующее СОЗДАННУЮ библиотеку DLL, в строке меню выберите файл > Новый > проект. To create a C++ app that uses the DLL that you created, on the menu bar, choose File > New > Project.

В левой области диалогового окна Новый проект выберите Классическое приложение Windows в разделе Установленные > Visual C++ . In the left pane of the New Project dialog, select Windows Desktop under Installed > Visual C++. В центральной области выберите консольное приложение Windows. In the center pane, select Windows Console Application. Укажите имя проекта масклиентв поле ввода имя . Specify the name for the project, MathClient, in the Name edit box. Оставьте значения расположения и имени решения по умолчанию. Leave the default Location and Solution name values. Задайте решение для создания нового решения. Set Solution to Create new solution. Установите флажок создать каталог для решения , если он не установлен. Check Create directory for solution if it’s unchecked.

Нажмите кнопку ОК , чтобы создать проект клиентского приложения. Choose OK to create the client app project.

Для вас создается минимальный проект консольного приложения. A minimal console application project is created for you. Имя главного исходного файла будет совпадать с ранее введенным именем проекта. The name for the main source file is the same as the project name that you entered earlier. В этом примере используется имя MathClient.cpp. In this example, it’s named MathClient.cpp. Вы можете создать проект, но он еще не использует вашу библиотеку DLL. You can build it, but it doesn’t use your DLL yet.

Создание клиентского приложения в Visual Studio 2015 To create a client app in Visual Studio 2015

Чтобы C++ создать приложение, использующее СОЗДАННУЮ библиотеку DLL, в строке меню выберите файл > Новый > проект. To create a C++ app that uses the DLL that you created, on the menu bar, choose File > New > Project.

В левой области диалогового окна Новый проект щелкните Win32 в разделе Установленные > Шаблоны > Visual C++ . In the left pane of the New Project dialog, select Win32 under Installed > Templates > Visual C++. В центральной области выберите Консольное приложение Win32. In the center pane, select Win32 Console Application. Укажите имя проекта масклиентв поле ввода имя . Specify the name for the project, MathClient, in the Name edit box. Оставьте значения расположения и имени решения по умолчанию. Leave the default Location and Solution name values. Задайте решение для создания нового решения. Set Solution to Create new solution. Установите флажок создать каталог для решения , если он не установлен. Check Create directory for solution if it’s unchecked.

Нажмите кнопку ​​ОК, чтобы закрыть диалоговое окно Новый проект, и запустите мастер приложений Win32. Choose the OK button to dismiss the New Project dialog and start the Win32 Application Wizard. На странице Обзор диалогового окна Мастер приложений Win32 нажмите кнопку Далее . On the Overview page of the Win32 Application Wizard dialog box, choose the Next button.

На странице Параметры приложения в поле Тип приложения выберите пункт Консольное приложение, если он еще не выбран. On the Application Settings page, under Application type, select Console application if it isn’t already selected.

Нажмите кнопку Готово , чтобы создать проект. Choose the Finish button to create the project.

После завершения работы мастера создается минимальный проект консольного приложения. When the wizard finishes, a minimal console application project is created for you. Имя главного исходного файла будет совпадать с ранее введенным именем проекта. The name for the main source file is the same as the project name that you entered earlier. В этом примере используется имя MathClient.cpp. In this example, it’s named MathClient.cpp. Вы можете создать проект, но он еще не использует вашу библиотеку DLL. You can build it, but it doesn’t use your DLL yet.

Затем для вызова функций Маслибрари в исходном коде проект должен содержать файл маслибрари. h . Next, to call the MathLibrary functions in your source code, your project must include the MathLibrary.h file. Этот файл заголовка можно скопировать в проект клиентского приложения, а затем добавить его в проект как существующий элемент. You could copy this header file into your client app project, then add it to the project as an existing item. Этот метод подходит для сторонних библиотек. This method can be a good choice for third-party libraries. Однако если вы работаете с кодом для библиотеки DLL и клиента одновременно, файлы заголовков могут оказаться несинхронизированными. Чтобы избежать этой проблемы, задайте в проекте путь к дополнительным каталогам включения , чтобы включить путь к исходному заголовку. However, if you’re working on the code for your DLL and your client at the same time, the header files could get out of sync. To avoid this issue, set the Additional Include Directories path in your project to include the path to the original header.

Читайте также:  Установка и настройка tftp centos

Добавление заголовка библиотеки DLL в путь включения To add the DLL header to your include path

Щелкните правой кнопкой мыши узел MathClient в обозревателе решений, чтобы открыть диалоговое окно Страницы свойств. Right-click on the MathClient node in Solution Explorer to open the Property Pages dialog.

В раскрывающемся списке Конфигурация выберите пункт все конфигурации , если они еще не выбраны. In the Configuration drop-down box, select All Configurations if it’s not already selected.

В области слева выберите Свойства конфигурации > Общиесведения о языкеC++ C/ > . In the left pane, select Configuration Properties > C/C++ > General.

На панели свойств щелкните раскрывающийся элемент управления рядом с полем ввода параметра Дополнительные каталоги включаемых файлов, а затем щелкните Правка. In the property pane, select the drop-down control next to the Additional Include Directories edit box, and then choose Edit.

Дважды щелкните в верхней панели диалогового окна Дополнительные каталоги включаемых файлов, чтобы включить элемент управления «Поле ввода». Double-click in the top pane of the Additional Include Directories dialog box to enable an edit control. Или щелкните значок папки, чтобы создать новую запись. Or, choose the folder icon to create a new entry.

В элементе управления «Поле ввода» укажите путь к расположению файла заголовка MathLibrary.h. In the edit control, specify the path to the location of the MathLibrary.h header file. Чтобы перейти к нужной папке, можно выбрать элемент управления с многоточием ( . ). You can choose the ellipsis (. ) control to browse to the correct folder.

Можно также ввести относительный путь от исходных файлов клиента в папку, содержащую файлы заголовков DLL. You can also enter a relative path from your client source files to the folder that contains the DLL header files. Если следовать инструкциям по размещению клиентского проекта в отдельном решении из библиотеки DLL, относительный путь должен выглядеть следующим образом: If you followed the directions to put your client project in a separate solution from the DLL, the relative path should look like this:

Если библиотеки DLL и клиентские проекты находятся в одном решении, относительный путь может выглядеть следующим образом: If your DLL and client projects are in the same solution, the relative path might look like this:

Если библиотеки DLL и клиентские проекты находятся в других папках, измените относительный путь для соответствия. When the DLL and client projects are in other folders, adjust the relative path to match. Или используйте элемент управления многоточием для поиска папки. Or, use the ellipsis control to browse for the folder.

После ввода пути к файлу заголовка в диалоговом окне Дополнительные каталоги включаемых файлов нажмите кнопку ОК . After you’ve entered the path to the header file in the Additional Include Directories dialog box, choose the OK button. В диалоговом окне страницы свойств нажмите кнопку ОК , чтобы сохранить изменения. In the Property Pages dialog box, choose the OK button to save your changes.

Теперь можно добавить файл MathLibrary.h и использовать функции, которые он объявляет, в вашем клиентском приложении. You can now include the MathLibrary.h file and use the functions it declares in your client application. Замените содержимое файла MathClient.cpp, используя следующий код: Replace the contents of MathClient.cpp by using this code:

Этот код может быть скомпилирован, но не связан. This code can be compiled, but not linked. Если вы создаете клиентское приложение, в списке ошибок появится несколько ошибок LNK2019. If you build the client app now, the error list shows several LNK2019 errors. Причина в том, что в проекте отсутствуют некоторые сведения: вы не указали, что проект еще не зависит от библиотеки маслибрари. lib . That’s because your project is missing some information: You haven’t specified that your project has a dependency on the MathLibrary.lib library yet. И вы не указали компоновщику, как найти файл маслибрари. lib . And, you haven’t told the linker how to find the MathLibrary.lib file.

Чтобы устранить эту проблему, можно скопировать файл библиотеки непосредственно в проект клиентского приложения. To fix this issue, you could copy the library file directly into your client app project. Компоновщик сможет найти и использовать его автоматически. The linker would find and use it automatically. Однако если и библиотека, и клиентское приложение находятся в разработке, это может привести к изменениям в одной копии, которая не отображается в другой. However, if both the library and the client app are under development, that might lead to changes in one copy that aren’t shown in the other. Чтобы избежать этой проблемы, можно задать свойство Дополнительные зависимости , чтобы сообщить системе сборки о том, что ваш проект зависит от маслибрари. lib. To avoid this issue, you can set the Additional Dependencies property to tell the build system that your project depends on MathLibrary.lib. Кроме того, можно задать в проекте путь к дополнительным каталогам библиотек , чтобы включить путь к исходной библиотеке при компоновке. And, you can set an Additional Library Directories path in your project to include the path to the original library when you link.

Добавление библиотеки импорта DLL в проект To add the DLL import library to your project

Щелкните правой кнопкой мыши узел масклиент в Обозреватель решений и выберите Свойства , чтобы открыть диалоговое окно страницы свойств . Right-click on the MathClient node in Solution Explorer and choose Properties to open the Property Pages dialog.

В раскрывающемся списке Конфигурация выберите пункт все конфигурации , если они еще не выбраны. In the Configuration drop-down box, select All Configurations if it’s not already selected. Это гарантирует, что любые изменения свойств применяются к сборкам отладки и выпуска. It ensures that any property changes apply to both Debug and Release builds.

В левой области выберите Свойства конфигурации > Компоновщик > входные данные. In the left pane, select Configuration Properties > Linker > Input. На панели свойств щелкните раскрывающийся элемент управления рядом с полем ввода параметра Дополнительные зависимости, а затем щелкните Правка. In the property pane, select the drop-down control next to the Additional Dependencies edit box, and then choose Edit.

![Изменение свойства «Дополнительные зависимости»](media/mathclient-additional-dependencies-property.png «Изменение свойства «Дополнительные зависимости»»)

В диалоговом окне Дополнительные зависимости добавьте маслибрари. lib в список в верхнем элементе управления Edit. In the Additional Dependencies dialog, add MathLibrary.lib to the list in the top edit control.

Нажмите кнопку OK, чтобы вернуться в диалоговое окно Страницы свойств. Choose OK to go back to the Property Pages dialog box.

В левой области выберите Свойства конфигурации > Компоновщик > Общие. In the left pane, select Configuration Properties > Linker > General. На панели свойств щелкните раскрывающийся элемент управления рядом с полем ввода параметра Дополнительные каталоги библиотек, а затем щелкните Правка. In the property pane, select the drop-down control next to the Additional Library Directories edit box, and then choose Edit.

Дважды щелкните в верхней панели диалогового окна Дополнительные каталоги библиотек, чтобы включить элемент управления «Поле ввода». Double-click in the top pane of the Additional Library Directories dialog box to enable an edit control. В элементе управления «Поле ввода» укажите путь к расположению файла MathLibrary.lib. In the edit control, specify the path to the location of the MathLibrary.lib file. По умолчанию он находится в папке с именем Debug непосредственно в папке DLL-решения. By default, it’s in a folder called Debug directly under the DLL solution folder. При создании сборки выпуска файл помещается в папку с именем Release. If you create a release build, the file is placed in a folder called Release. Можно использовать макрос $(IntDir) , чтобы компоновщик мог найти библиотеку DLL независимо от типа создаваемой сборки. You can use the $(IntDir) macro so that the linker can find your DLL, no matter which kind of build you create. Если следовать инструкциям по размещению клиентского проекта в отдельном решении из проекта DLL, относительный путь должен выглядеть следующим образом: If you followed the directions to put your client project in a separate solution from the DLL project, the relative path should look like this:

Если библиотеки DLL и клиентские проекты находятся в других расположениях, измените относительный путь для соответствия. If your DLL and client projects are in other locations, adjust the relative path to match.

Как только вы ввели путь к файлу библиотеки, в диалоговом окне Дополнительные каталоги библиотек нажмите кнопку ОК, чтобы вернуться в диалоговое окно Страницы свойств. Once you’ve entered the path to the library file in the Additional Library Directories dialog box, choose the OK button to go back to the Property Pages dialog box. Нажмите кнопку ОК , чтобы сохранить изменения свойств. Choose OK to save the property changes.

Ваше клиентское приложение теперь можно компилировать и компоновать, но в нем по-прежнему нет всего необходимого для запуска. Your client app can now compile and link successfully, but it still doesn’t have everything it needs to run. Когда операционная система загружает ваше приложение, оно ищет библиотеку DLL MathLibrary. When the operating system loads your app, it looks for the MathLibrary DLL. Если она не может найти библиотеку DLL в определенных системных каталогах, в пути среды или локальном каталоге приложения, загрузка завершается сбоем. If it can’t find the DLL in certain system directories, the environment path, or the local app directory, the load fails. В зависимости от операционной системы вы увидите сообщение об ошибке следующего вида: Depending on the operating system, you’ll see an error message like this:

![Ошибка «Библиотека DLL Маслибрари не найдена»](media/mathclient-system-error-mathlibrary-dll-not-found.png «Ошибка «Библиотека DLL Маслибрари не найдена»»)

Чтобы избежать этой проблемы, можно скопировать библиотеку DLL в каталог, в котором находится исполняемый файл клиента, в процессе сборки. One way to avoid this issue is to copy the DLL to the directory that contains your client executable as part of the build process. Вы можете добавить в проект событие после сборки , чтобы добавить команду, которая копирует библиотеку DLL в выходной каталог сборки. You can add a Post-Build Event to your project, to add a command that copies the DLL to your build output directory. Указанная здесь команда копирует библиотеку DLL только в том случае, если она отсутствует или была изменена. The command specified here copies the DLL only if it’s missing or has changed. Он использует макросы для копирования в расположения отладки или выпуска на основе конфигурации сборки. It uses macros to copy to and from the Debug or Release locations, based on your build configuration.

Копирование библиотеки DLL в событие после сборки To copy the DLL in a post-build event

Щелкните правой кнопкой мыши узел масклиент в Обозреватель решений и выберите Свойства , чтобы открыть диалоговое окно страницы свойств . Right-click on the MathClient node in Solution Explorer and choose Properties to open the Property Pages dialog.

В раскрывающемся списке Конфигурация выберите пункт Все конфигурации, если он еще не выбран. In the Configuration drop-down box, select All Configurations if it isn’t already selected.

В левой области выберите Свойства конфигурации > события сборки > событие после сборки. In the left pane, select Configuration Properties > Build Events > Post-Build Event.

На панели свойств выберите элемент управления Edit в поле Командная строка . In the property pane, select the edit control in the Command Line field. Если вы представили инструкции по размещению клиентского проекта в отдельном решении из проекта DLL, введите следующую команду: If you followed the directions to put your client project in a separate solution from the DLL project, then enter this command:

xcopy /y /d «..\..\MathLibrary\$(IntDir)MathLibrary.dll» «$(OutDir)»

Если библиотеки DLL и клиентские проекты находятся в других каталогах, измените относительный путь к библиотеке DLL для соответствия. If your DLL and client projects are in other directories, change the relative path to the DLL to match.

Нажмите кнопку OK, чтобы сохранить изменения в свойствах проекта. Choose the OK button to save your changes to the project properties.

Теперь в вашем клиентском приложении есть все, что нужно для сборки и запуска. Now your client app has everything it needs to build and run. Соберите приложение, щелкнув команду Сборка > Собрать решение в меню. Build the application by choosing Build > Build Solution on the menu bar. Окно вывода в Visual Studio должно иметь нечто вроде следующего примера в зависимости от используемой версии Visual Studio: The Output window in Visual Studio should have something like the following example depending on your version of Visual Studio:

Поздравляем, вы создали приложение, которое вызывает функции в вашей библиотеке DLL. Congratulations, you’ve created an application that calls functions in your DLL. Теперь запустите свое приложение, чтобы увидеть, как оно работает. Now run your application to see what it does. В строке меню щелкните Отладка > Начать без отладки. On the menu bar, choose Debug > Start Without Debugging. В Visual Studio открывается командное окно для запуска программы. Visual Studio opens a command window for the program to run in. Последняя часть выходных данных должна выглядеть так: The last part of the output should look like:

Для закрытия командного окна нажмите любую клавишу. Press any key to dismiss the command window.

Теперь, когда вы создали библиотеку DLL и клиентское приложение, вы можете экспериментировать. Now that you’ve created a DLL and a client application, you can experiment. Попробуйте задать точки останова в коде клиентского приложения и запустите приложение в отладчике. Try setting breakpoints in the code of the client app, and run the app in the debugger. Посмотрите, что происходит, когда вы входите в вызов библиотеки. See what happens when you step into a library call. Добавьте другие функции в библиотеку или напишите другое клиентское приложение, которое использует вашу библиотеку DLL. Add other functions to the library, or write another client app that uses your DLL.

При развертывании приложения необходимо также развернуть используемые им библиотеки DLL. When you deploy your app, you must also deploy the DLLs it uses. Самый простой способ сделать создаваемые библиотеки DLL или включить их из третьих сторон — поместить их в тот же каталог, где находится приложение. The simplest way to make the DLLs that you build, or that you include from third parties, available is to put them in the same directory as your app. Это называется развертыванием в локальном приложении. It’s known as app-local deployment. Дополнительные сведения о развертывании см. в разделе Deployment in Visual C++. For more information about deployment, see Deployment in Visual C++.

источник