Страница 1 из 2

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

СообщениеДобавлено: 28 май 2012, 14:35
pod4444
Поговорим о том как использовать библиотеки классов в своих проектах на [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.

Если есть дополнения буду рад.

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

СообщениеДобавлено: 29 май 2012, 06:16
IDoNotExist
Пример внедрения dll в проект неплохо было бы привести.

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

СообщениеДобавлено: 29 май 2012, 07:26
Syberex
Тему поднял хорошую, а что и как не рассказал ... только плюсы, минусы и о своих ковыряниях пару строк (P)
Давай по пунктам и пару картинок ;)

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

СообщениеДобавлено: 29 май 2012, 09:23
pod4444
Ну ок, все сверху (:

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

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

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

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


У меня библиотеки на 2.0 отлично работают, в них нет MonoBehaviour. Просто dll.
Из старой версии .Net нельзя линковать новую, а наоборот можно.

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

СообщениеДобавлено: 18 июн 2012, 23:03
12sd
а почему бы тогда не создавать dll прямо в моно?
тогда и вопросы совместимости отпадут.

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

СообщениеДобавлено: 19 июн 2012, 08:51
pod4444
12sd писал(а):а почему бы тогда не создавать dll прямо в моно?
тогда и вопросы совместимости отпадут.

Потому что VS удобнее

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

СообщениеДобавлено: 04 июл 2012, 12:50
DanielDem
Еще один плюс использования DLL - возможность хранить внутренние ресурсы

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

СообщениеДобавлено: 16 июл 2013, 10:59
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

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

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

СообщениеДобавлено: 16 июл 2013, 11:38
pod4444
О таких вещах раньше я мог только мечтать, статья писалась когда я только освоился в шарпе.
Примерно в то время я искренне верил, что JS транслитерируется в C#, а потом только в IL код.
Будет время, дополню её.

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

СообщениеДобавлено: 16 июл 2013, 11:45
Neodrop
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)

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

СообщениеДобавлено: 11 сен 2014, 13:07
Diab10
Всем привет! Всё сделал по статье, получилось.
Но теперь данный код перестал работать:

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


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

Что делать, подскажите? Это катастрофа :( :ympray:

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

СообщениеДобавлено: 11 сен 2014, 13:28
waruiyume
Если я всё правильно понимаю, то нет никакого, по крайней мере простого, решения, т.к. код внутри директив компилятора в dll не попадёт.
http://msdn.microsoft.com/ru-ru/library/4y6tbswk.aspx

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

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


Да, кажется понял.
Т.е. если мы пишем директивы в скриптах, то при компиляции код оставляется, либо вырезается.
А при использовании dll, то код получается уже скомпилирован в dll'ке? И при перекомпиляции проекта перекомпиляции dll не происходит, поэтому и дерективы не работают?