Как скомпилировать cs в dll

Обновлено: 06.07.2024

Последнее обновление: 02.06.2012

Что делать, если не установлена Visual Studio, но так хочется что-нибуль скомпилировать.

Для начала напишем в любом текстовом редакторе простое приложение и сохраним его в файл HelloWorld.cs:

Теперь скомпилируем и запустим его.

Как скомпилировать CPP в EXE

Допустим, путь в командной строке установлен на текущий каталог нашего файла HelloWorld.cs. Тогда введем в командную строку следующую команду (в данном случае у меня установлен 4-й фреймворк в папке v4.0.30319):

Если ошибок при компиляции не возникло, то в одном каталоге с HelloWorld.cs мы увидим скомпилированный файл HelloWorld.exe.

Параметры компиляции

Компилятор может принимать следующие выходные параметры:

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

Создает консольное приложение. Используется по умолчанию

Позволяет создать библиотеку dll

Позволяет создать графическое приложение. При этом консоль скрывается.

Позволяет создать модуль

Теперь создадим простейшее графическое приложение:

Скомпилируем его с помощью строки:.

И после запуска мы увидим нашу форму. Если бы мы не использовали target:winexe, то также скомпилировали бы графическое приложение, только тогда при запуске была видна также и консоль.

При компиляции у нас может быть ситуация, когда у нас несоклько исходных файлов, и нам нужно создать из них одно приложени. Тогда все эти файлы либо перечисляются при компиляции (csc.exe WindowWorld.cs File1.cs File2.cs File3.cs), либо если надо включить все файлы текущего каталога, то можно использовать следующую запись: .

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

csc.exe /reference:System.Windows.Forms.dll;System.Drawing.dll WindowWorld.cs

Как скомпилировать файлы C в исполняемый файл (.exe)?

Выберите букву с которой начинается название dll которую вы ищите:

Нужна помощь в установке cl.dll?

Администрация сайта не несет ответственности за ваши действия

В Windows x64 необходимо поместить файл в директорию

Проблемы с установкой? Прочтите рекомендации по установке DLL файлов

Ошибки cl.dll


Наиболее распространенные ошибки связанные с файлом.

С этим файлом скачали

Первая программа в Visual Studio

Последнее обновление: 28.08.2017



В центральной части окна в качестве типа проекта выберем Empty Project, а внизу окна в поле для имени проекта дадим проекту имя HelloApp и нажмем на ОК для создания проекта.


Затем нам откроется окно для добавления нового элемента:


Здесь нам надо выбрать пункт C++ File(.cpp), а внизу окна укажем для файла имя Hello.cpp. Как правило, исходные файлы на C++ имеют расширение .сpp.

После добавления файла изменим опции проекта. Для этого перейдем к пункту меню Project -> Properties:


И в открывшемся окне свойств проекта в левой части перейдем к секции Linker ->System и далее для поля SubSystem установим значение Console(/SUBSYSTEM:CONSOLE), выбрав нужный элемент в списке:


После добавления файла проект будет иметь следующую структуру:


Вкратце пробежимся по этой структуре. Окно Solution Explorer содержит в решение. В данном случае оно называется HelloApp. Решение может содержать несколько проектов.

как скомпилировать cpp в exe

External Dependencies: отображает файлы, которые используются в файлах исходного кода, но не являются частью проекта

Header Files: предназначена для хранения заголовочных файлов с расширением .h

Resource Files: предназначена для хранения файлов ресурсов, например, изображений

Source Files: хранит файлы с исходным кодом

Теперь собственно создадим первую программу и определим в файле Hello.cpp простейший код, который будет выводить строку на консоль:

Здесь использован весь тот код, который был рассмотрен в предыдущих темах про компиляцию с помощью g++.

Теперь запустим программу. Для этого в Visual Studio нажмем на сочетание клавиш Ctrl+F5 или выберем пункт меню Debug -> Start Without Debugging:



После этого на жестком диске в проекте в папке Debug можно увидеть скомпилированный файл exe, который мы можем запускать независимо от Visual Studio:

Я хочу скомпилировать все эти cs-файлы в другой dll.

PS: возможно, некоторым из них понадобится больше одного файла класса.

4 ответа

Вы должны создавать различные проекты в своем решении (предполагая, что вы работаете в Visual Studio).

Каждый проект может иметь несколько файлов (класс, ресурс, форма и т. д.) и будет скомпилирован в разные сборки (dll). Для каждого проекта вы можете указать настройки (имя assembly, целевой фреймворк и т. д.).

Классы из разных проектов могут "use" друг друга, делая ссылки из одного проекта в другой. Кроме того, разные проекты могут указывать одни и те же пространства имен, чтобы вы могли структурировать приложение в соответствии со своими собственными пожеланиями.

Частью большого проекта является платежная система, которую я хотел бы использовать повторно. Я хочу объединить все файлы классов этой платежной системы в DLLs, чтобы добавить их в качестве ссылки во все другие проекты. Нынешняя платежная система также использует пространства имен из DLLs.

Я пытаюсь скомпилировать свой проект с mono на linux. Мой cmd выглядит примерно так. gmcs Pages/UserProfile.cs Properties/AssemblyInfo.cs queues.cs watch_editor.cs Class1.cs -define:USE_SQLITE -r:System -r:System.Collections -r:System.Collections.Generic -r:System.Collections.ObjectModel.

Все *. cs в одном проекте библиотеки классов будут компилироваться в один и тот же DLL, вы не можете разделить их на отдельные библиотеки DLL. Если вам нужны отдельные библиотеки DLL для каждого класса, то каждый из них должен находиться в отдельном проекте библиотеки классов.

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

Может ли кто-нибудь помочь мне программно преобразовать файл .cs в .dll?

Форум; Я новичок, разрабатывающий немного кода. Я хотел бы знать, как лучше всего использовать отдельные файлы .cs, содержащие другие классы и функции. В качестве примера базовой функции хотелось бы.

Как я могу скомпилировать файл .cs в файл DLL? Мой проект называется WA. В моей папке bin после компиляции я нашел: WA.exe WA.vshost.exe WA.pdb

Как скомпилировать файл .cs в файл .dll без использования Visual Studio? Вот пример файла: using UnityEngine; namespace Test < public class Loader < public static GameObject load_object; public.

Частью большого проекта является платежная система, которую я хотел бы использовать повторно. Я хочу объединить все файлы классов этой платежной системы в DLLs, чтобы добавить их в качестве ссылки.

Я пытаюсь скомпилировать свой проект с mono на linux. Мой cmd выглядит примерно так. gmcs Pages/UserProfile.cs Properties/AssemblyInfo.cs queues.cs watch_editor.cs Class1.cs -define:USE_SQLITE.

Добрый день.
В данном планируемом цикле статей я постараюсь объяснить основные моменты написания своих дополнений для клиентской части GoldSrc игр. В качестве «подопытного» будем использовать игру Counter Strike 1.6, хотя, этот модуль, по-идее, должен так же работать и в Half-Life и в других играх на этом же движке.

Что вам понадобится:

  • Сам клиент Counter Strike, желательно последних версий. Если у вас нет Steam, можно раздобыть здесь или купить здесь.
  • Желательно так же заполучить эту же версию клиента для Linux или MacOs (или попросить скинуть кого-нибудь hw.so или hw.dylib из неё. А лучше всю директорию Half-Life целиком)
  • Так же нам понадобится IDA PRO
  • Какая-нибудь среда разработки, например, Visual Studio.

Основные моменты

  • cl_dll
  • common
  • dlls
  • engine
  • game_shared
  • pm_shared
  • public

Приведите stdafx.h к следующему виду:

Загрузка модуля

Как наш модуль будет загружаться в игру? Всё просто, GoldSrc использует библиотеку mss32.dll, которая подгружает все .asi-файлы, находящиеся в корневой директории игры в качестве дополнительных модулей. Эти .asi-файлы, по факту, ни что иное как обычные .dll-ки.
Поэтому, в настройках проекта, в качестве конечного расширения поставьте не .dll, а .asi.

.asi-модуль под линуксом это нечто странное и не совсем понятное (они там тоже есть и тоже работают, но у них в заголовках не ELF а MZ. PE. Кто-нибудь, объясните пожалуйста, как такое возможно?), поэтому вариант "asi под Linux" я предпочитаю оставить в покое.
Зато загрузка игры нашем модулем, вроде как, должна под Linux заработать. Поэтому, по возможности, старайтесь делать код кроссплатформенным.

Если вы на данном этапе попробуете скомпилировать модуль и закинуть его в директорию Half-Life, поставив в DllMain MessageBox-ы на загрузку и на выгрузку, вы увидите, что модуль выгрузится сразу после загрузки. Причина заключается в том, что mss32.dll выгружает модуль, если в нём нет экспортируемой функции RIB_Main.
Если честно, то asi-модули для более старых версий GoldSrc, например, у версии 4554, спокойно себе грузились через DllMain, но в версии 6027 (эта та, с которой я начал эти «копания»), уже использовалась функция Rib_Main

Создайте в проекте 2 файла: AsiMain.cpp и AsiMain.h
В функцию RibMain передаются 5 параметров, из них 3- указатели на функции, использующиеся для регистрации провайдеров, которых у нас не будет, поэтому, по большому счёту, их можно заменить на void*. Однако я не оставляю надежды когда-нибудь разобраться с использованием этих модулей «по назначению», поэтому, давайте объявим функцию так, как она должна объявляться.
Для начала, заполните AsiMain.h

Теперь нужно заполнить AsiMain.cpp

Ура. Asi-модуль, который ничего не делает, готов.
Но хотелось бы, чтобы он что-то делал.
Давайте попробуем воспользоваться структурой cl_enginefuncs_t. Она описана в HLSDK\engine\APIProxy.h и в ней есть много чего полезного.
Для начала нужно её найти. По-хорошему, поиск нужных элементов нужно как-то автоматизировать. Однако, я пока не представляю, как искать структуру по сигнатуре или по каким-нибудь другим параметрам. Если мне кто-нибудь это объяснит, буду признателен. :)
Для поиска cl_enginefuncs_t воспользуемся IDA Pro, причём, желательно, сразу двумя.
Откройте hw.dll, который вы найдёте в своей директории Half-Life. По окончании декомпиляции перебазируйте модуль на 0x40000000. Это нужно для более удобного поиска адреса структуры. Для этого откройте Edit->Segments->Rebase Program, убедитесь что поставлены оба чекбокса и переключатель стоит на ImageBase и впишите в Value 0x40000000.
Теперь откройте hw.so, которую вы можете скачать отсюда.
И там и там найдите строку ScreenShake
То, что вы увидите будет выглядить примерно так:




Так как код hw.dll и hw.so большей частью одинаковый, то функциям в hw.dll можно задать нормальные имена, позаимствовав их из hw.so.



Посмотрите, по какому адресу находится cl_enginefuncs в hw.dll.
У меня это 0x40134260. Так как мы базировали модуль по адресу 0x40000000, значит смещение этой структуры будет 0x134260

Вот теперь можно что-нибудь сделать.
Объявите в AsiMain.cpp, в глобальной области


Там же, перед RibMain создайте функцию


В код RibMain, который выполняется при запуске допишите

Теперь при вводе в консоль команды SayHello будет выводиться Hello, Habrahabr.

Читайте также: