c# dll и с чем их едят

Научился сам? Помоги начинающему.

c# dll и с чем их едят

Сообщение pod4444 28 май 2012, 14:35

Поговорим о том как использовать библиотеки классов в своих проектах на [unity 3D].
Для начала рассмотрим несколько плюсов их использования.

Плюсы библиотек классов:

1) в удобном использование namespace
2) классы, которые не являются MonoBehaviour cкрываются -> отсутствие свалки в проекте
3) защита от школьников: многих отпугнет само использование библиотек, а если пройтись обфускатором, то читаемость кода значительно упадет.
4) удобная транспортировка кода, например если Вы используете какой-то врапер функций, очень удобно копировать всего лишь один файл и сразу же приступать к работе.
5) хранение внутренних ресурсов (картинок, звуков и тд)
6) да просто красиво и удобно (:

Теперь попробуем создать свою библиотеку и запустить с ней проект.

Как начать использовать .dll в своем проекте


Первое, что мы должны сделать - это создать в любом IDE библиотеку классов. В Microsoft Visual Studio C# Professional это выглядит так File->New->Project

Изображение

Чтобы работать с UnityEngine ее нужно пролинковать, делается это так - в каждой библиотеке есть закладка References в окне Solution Explorer, кликаем правой, выбираем Add Reference

Изображение

Файл UnityEngine.dll находится в %ProgramFiles%\Unity\Editor\Data\Managed\

Изображение

При работе в дальнейшем можно использовать закладку Recent, там хранятся последние использованные библиотеки:

Изображение

После добавления ссылки на библиотеки, она появится в нужной закладке, и в Вашем проекте можно будет писать так using UnityEngine;
Отключим локальное копирование библиотеки, чтобы не было конфликтов, эти библиотеки уже есть в окружении юнити:

Изображение

Изображение

Теперь настроим сохранение сборки в нужное место, т.е в %НашПроектНаЮнити%\Assets\. Для начала зайдем в настройки нашего проекта Project - Project Properties

Изображение

В закладку Build

Изображение

Там мы увидим поле Output Path. Этот тот путь по которому будет собираться наша библиотека(-и).

Изображение

Не забываем, что у любого проекта есть два состояния Debug\Release и пути сборки у них будут разные, т.е если Вы переключите конфигурацию, то заметите - путь изменился.

Изображение

А так же вам понадобится кнопка Advanced..., находится она снизу в этом же окне

Изображение

Там можно отключить Debug Info, чтобы при сборке у Вас не было символов отладки, если они необходимы, то нужно в настройках проекта в Build Events -> Post-build прописать генерацию поддерживаемых Mono символов (.mdb) строка будет примерно такая
"c:\Program Files (x86)\Unity\Editor\Data\Mono\lib\mono\2.0\pdb2mdb.exe" $(TargetFileName)

Изображение

Сам момент написания кода я затрагивать не буду. Предположим, что Вы уже описали свои классы и пришло время попробовать запустить код в [unity 3D]
Чтобы собрать все решение нужно нажать кнопку F6, соберутся все библиотеки в солюшене, если они изменялись. Чтобы собрать библиотеку под выделением нажимаем Shift+F6, подробнее можно посмотреть в менюшке Build

Изображение

Если вы правильно указали путь, то .dll окажется сразу в проекте. Все MonoBehaviour можно просмотреть просто раскрыв библиотеку, у меня получилось вот так:

Изображение

Пример решения(Solution) из четырех .dll:

Изображение


Тонкости

Во-первых, версия сборки должна быть жестко .NET Framework 3.5, если меньше, то Вы не сможете пролинковать UnityEngine.dll и UnityEditor.dll, а если больше, то тогда не поддерживает Mono в Unity3d.
Во-вторых, Editor классы можно прятать внутри dll,но в связи с тонкостями сборки готового билда, едитор классы нужно прятать в отдельном от монобех dll, а получившуюся сборку класть обязательно в папку Editor.

В некоторых случаях нужно будет настроить порядок выполнения скриптов, находится это в Edit->Project Settings->Script Execution Order.

Если есть дополнения буду рад.
Последний раз редактировалось pod4444 05 дек 2015, 18:04, всего редактировалось 7 раз(а).
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: c# dll и с чем их едят

Сообщение IDoNotExist 29 май 2012, 06:16

Пример внедрения dll в проект неплохо было бы привести.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: c# dll и с чем их едят

Сообщение Syberex 29 май 2012, 07:26

Тему поднял хорошую, а что и как не рассказал ... только плюсы, минусы и о своих ковыряниях пару строк (P)
Давай по пунктам и пару картинок ;)
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: c# dll и с чем их едят

Сообщение pod4444 29 май 2012, 09:23

Ну ок, все сверху (:
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: c# dll и с чем их едят

Сообщение driverz 29 май 2012, 14:51

с Editor подсказал, а то делал библиотеку под 2.0 и пролинковать UnityEditor.dll не получалось. Только вот теперь вопрос, какую среду он использует при подключенной библиотеке 3.5? К примеру есть библиотека которая в юнити работать не хочет, а в моно все хорошо и она точно под 2.0.Хотелось бы понять принцип почему так происходит?
driverz
UNец
 
Сообщения: 33
Зарегистрирован: 25 окт 2011, 13:09

Re: c# dll и с чем их едят

Сообщение pod4444 29 май 2012, 15:18

driverz писал(а):с Editor подсказал, а то делал библиотеку под 2.0 и пролинковать UnityEditor.dll не получалось. Только вот теперь вопрос, какую среду он использует при подключенной библиотеке 3.5? К примеру есть библиотека которая в юнити работать не хочет, а в моно все хорошо и она точно под 2.0.Хотелось бы понять принцип почему так происходит?


У меня библиотеки на 2.0 отлично работают, в них нет MonoBehaviour. Просто dll.
Из старой версии .Net нельзя линковать новую, а наоборот можно.
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: c# dll и с чем их едят

Сообщение 12sd 18 июн 2012, 23:03

а почему бы тогда не создавать dll прямо в моно?
тогда и вопросы совместимости отпадут.
Добавить egorchiks96 в Skype
12sd
UNIт
 
Сообщения: 71
Зарегистрирован: 16 июл 2011, 21:47

Re: c# dll и с чем их едят

Сообщение pod4444 19 июн 2012, 08:51

12sd писал(а):а почему бы тогда не создавать dll прямо в моно?
тогда и вопросы совместимости отпадут.

Потому что VS удобнее
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: c# dll и с чем их едят

Сообщение DanielDem 04 июл 2012, 12:50

Еще один плюс использования DLL - возможность хранить внутренние ресурсы
Да прибудет с Вами сила...
Аватара пользователя
DanielDem
UNITрон
 
Сообщения: 174
Зарегистрирован: 07 янв 2010, 13:27
Откуда: Россия
  • ICQ

Re: c# dll и с чем их едят

Сообщение Syleiman 16 июл 2013, 10:59

Дополнения есть. :)
При таком подходе, что предлагаешь ты, нельзя будет отлаживать код в dll - а это важно. Ты не сможешь ставить в их коде брейкпойнты, смотреть стек-трейс нормально (с указанием номеров строк кода).

Для того, чтобы отлаживаться надо сделать вот что:
1) Не отключать Debug info - в этом случает рядом с dll появится файл *.pdb - в нем хранятся отладочные символы.
К сожалению, Unity с ними работать не умеет, их надо сконвертировать - п. 2.

2) [Для MS Visula studio]. В свойствах проекта dll надо зайти в Build Events -> Post-build event command line и там прописать вот это [для Unity 3.x и Win64]
"c:\Program Files (x86)\Unity\Editor\Data\Mono\lib\mono\2.0\pdb2mdb.exe" $(TargetFileName)

После этого, при билде проекта в том же каталоге, где будет находиться dll появится еще и сконвертированный файл с отладочными символами - *.mdb

И вот после этого можно будет нормально отлаживаться.
Малый человек и на горе мал, исполин велик и в яме.
М. В. Ломоносов
Syleiman
UNIт
 
Сообщения: 53
Зарегистрирован: 12 апр 2011, 09:15

Re: c# dll и с чем их едят

Сообщение pod4444 16 июл 2013, 11:38

О таких вещах раньше я мог только мечтать, статья писалась когда я только освоился в шарпе.
Примерно в то время я искренне верил, что JS транслитерируется в C#, а потом только в IL код.
Будет время, дополню её.
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт

Re: c# dll и с чем их едят

Сообщение Neodrop 16 июл 2013, 11:45

Syleiman писал(а):Дополнения есть. :)
При таком подходе, что предлагаешь ты, нельзя будет отлаживать код в dll - а это важно. Ты не сможешь ставить в их коде брейкпойнты, смотреть стек-трейс нормально (с указанием номеров строк кода).

Для того, чтобы отлаживаться надо сделать вот что:
1) Не отключать Debug info - в этом случает рядом с dll появится файл *.pdb - в нем хранятся отладочные символы.
К сожалению, Unity с ними работать не умеет, их надо сконвертировать - п. 2.

2) [Для MS Visula studio]. В свойствах проекта dll надо зайти в Build Events -> Post-build event command line и там прописать вот это [для Unity 3.x и Win64]
"c:\Program Files (x86)\Unity\Editor\Data\Mono\lib\mono\2.0\pdb2mdb.exe" $(TargetFileName)

После этого, при билде проекта в том же каталоге, где будет находиться dll появится еще и сконвертированный файл с отладочными символами - *.mdb

И вот после этого можно будет нормально отлаживаться.


Вот это очень полезно. Спасибо большое за совет.
(3A4OT)
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: c# dll и с чем их едят

Сообщение Diab10 11 сен 2014, 13:07

Всем привет! Всё сделал по статье, получилось.
Но теперь данный код перестал работать:

Синтаксис:
Используется csharp
#if UNITY_EDITOR
Debug.Log("UNITY_EDITOR");
#endif


Т.е. всё что между #if UNITY_EDITOR ... #endif в dll перестало работать.

Что делать, подскажите? Это катастрофа :( :ympray:
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: c# dll и с чем их едят

Сообщение waruiyume 11 сен 2014, 13:28

Если я всё правильно понимаю, то нет никакого, по крайней мере простого, решения, т.к. код внутри директив компилятора в dll не попадёт.
http://msdn.microsoft.com/ru-ru/library/4y6tbswk.aspx
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: c# dll и с чем их едят

Сообщение Diab10 11 сен 2014, 13:34

waruiyume писал(а):Если я всё правильно понимаю, то нет никакого, по крайней мере простого, решения, т.к. код внутри директив компилятора в dll не попадёт.
http://msdn.microsoft.com/ru-ru/library/4y6tbswk.aspx


Да, кажется понял.
Т.е. если мы пишем директивы в скриптах, то при компиляции код оставляется, либо вырезается.
А при использовании dll, то код получается уже скомпилирован в dll'ке? И при перекомпиляции проекта перекомпиляции dll не происходит, поэтому и дерективы не работают?
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

След.

Вернуться в Уроки

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3