Настройка: Unity 2017.4.16f1 / 2018.2.18f1
У меня есть собственная написанная библиотека C#, использующая .Net. Библиотека отлично работает в приложении Winforms. Обычно он связывается с серверным приложением и получает некоторые данные.
Теперь мы хотим визуализировать данные в Unity. Для этого я следовал этому руководству: https://docs.unity3d.com/Manual/UsingDLL.html. Вкратце: перетащите библиотеку в папку активов, добавьте новый скрипт и получите доступ к библиотеке. Моей первой проблемой была совместимость. Поскольку я сначала использовал Unity 2017.4.16f1, мне нужно было понизить библиотеку с .Net 4.7.2 до .Net 4.6 и изменить настройки проекта на тот же .Net фреймворк. Избавившись от всех ошибок компилятора, я столкнулся с моей текущей проблемой.
Я подключил Visual Studio 2017 к единству, установил точку останова и запустил приложение в Unity. Точка останова находится при первом вызове функции из моей пользовательской библиотеки. Достигнута точка останова. Но если я скажу «Перейти» (через щелчок или F10), активная линия не переключается, и я возвращаюсь к Unity. Как будто я никогда не начинал отладку. Unity продолжает как ни в чем не бывало.
После этого я попробовал это с Unity 2018.2.18f1. Однако есть та же проблема. Библиотека не вызывается.
Что касается некоторых проблем совместимости, я создал проект Unity. Ошибка не возникает. Наконец, я сократил внешнюю библиотеку до базового уровня. Но снова я получил это странное поведение. Ниже приведен скрипт для единства и пример класса из пользовательской библиотеки. Спасибо за каждый совет.
C#:
[Serializable]
public class PostgreSQLParameters
[XmlElement(ElementName = "PostgreSQL_User", IsNullable = false)]
public string UserName
{
get
{
return this.userName;
}
set
{
if (this.userName == value)
return;
this.userName = value;
this.OnPropertyChanged();
}
}
public PostgreSQLParameters()
{ }
Unity:
void Start () {
string cwd = Directory.GetCurrentDirectory();
string pathVariable = Environment.GetEnvironmentVariable("PATH");
try
{
//this line has the break point, untill here all is ok
//after the Debug steps in, I hit F10 here to get to the next line,
//which should be the bracket befor the catch
PostgreSQLParameters parameter = new PostgreSQLParameters();
} // The cursor should be here after hitting F10, but disappears only
catch (Exception)
{
throw;
}
}
В противном случае он не виден при подключении к другой программе. Когда вы отлаживаете свою библиотеку в собственном проекте, эти файлы создаются для вас. Вам нужно будет перенести эти определения отладки в проект Unity для ссылки.
Я не хочу отлаживать внешнюю библиотеку, я хочу только отлаживать скрипт C# из Unity. Следовательно, он должен работать и с релизом. Тем не менее, я попробую. Кстати: я обновил вопрос.
Наконец-то у меня все заработало (см. ниже). Продолжается странное поведение: если я ставлю точку останова на строку с чужим кодом и "перешагиваю" (F10), я не попадаю на следующую строку кода. Вместо этого он ведет себя как нажатие «продолжить». Если я ставлю точку останова на строку за вызовом сторонней библиотеки, все работает нормально.





Основная проблема — зависимости. Я сравнил зависимости в своей библиотеке с ними из проекта Unity в Visual Studio. Оказывается, библиотека не была связана в Unity: System.Data.DataSetExtension. Есть два решения:
A) Если они вам не нужны, не добавляйте их в свою библиотеку. Удалите ссылку в библиотеке и снова скомпилируйте
Б) Или, если они вам нужны и являются частью .Net, сделайте следующее (не проверено):
добавьте файл с именем mcs.rsp в корень ресурса
Вставьте строку -r:System.Data.DataSetExtension (возьмите имя нужной вам ссылки)
Перезапустить единство
DLL скомпилирована для отладки и скопирована со всеми файлами отладки?