C# как скрипт. Компиляция с nuget рефами
От: Sаныч Таиланд  
Дата: 01.05.24 08:59
Оценка:
С обычными ясно через MetadataReference.CreateFromFile. С нугетами по сложнее — их же нужно сначата отрезолвить, скачать и только потом компилировать.

Какой то есть уже готовый класс для таких вещей?
Re: C# как скрипт. Компиляция с nuget рефами
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 01.05.24 18:01
Оценка:
Здравствуйте, Sаныч, Вы писали:

S>С обычными ясно через MetadataReference.CreateFromFile. С нугетами по сложнее — их же нужно сначата отрезолвить, скачать и только потом компилировать.


S>Какой то есть уже готовый класс для таких вещей?

Ну судя вот по этому в Roslyn Scripting API какие-то зачатки резолвинга NuGet присутствуют.
Но в документации какого-то упоминания я не нашел.

А можете чуть подробнее описать, что вы хотите получить?
Потому что у меня фраза "C# как скрипт", ассоциируется с "голым" C# кодом, в котором просто нет механизмов чтобы сослаться даже на внешнюю сборку, что уж там говорить про NuGet.
Поэтому у вас это или задается где-то вовне (и вы определяете список того, что доступно скрипту, а там уж используйте любой механизм ссылки на сборки) или у вас некий аналог файла проекта, но тогда, мне кажется, проще делать полноценную компиляцию.
Re: C# как скрипт. Компиляция с nuget рефами
От: IT Россия linq2db.com
Дата: 01.05.24 19:21
Оценка:
Здравствуйте, Sаныч, Вы писали:

S>С обычными ясно через MetadataReference.CreateFromFile. С нугетами по сложнее — их же нужно сначата отрезолвить, скачать и только потом компилировать.


S>Какой то есть уже готовый класс для таких вещей?


Не оно? https://github.com/dotnet-script/dotnet-script?tab=readme-ov-file#nuget-packages-1
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: C# как скрипт. Компиляция с nuget рефами
От: Sаныч Таиланд  
Дата: 02.05.24 02:46
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Потому что у меня фраза "C# как скрипт", ассоциируется с "голым" C# кодом, в котором просто нет механизмов чтобы сослаться даже на внешнюю сборку, что уж там говорить про NuGet.


Имелся ввиду подход с использованием CSharpCompilation. В этом случае добавление ссылок происходит через передачу путей к файлам. Конечно же, ссылки сохраняются не в коде напрямую, а в отдельном файле.
Re[2]: C# как скрипт. Компиляция с nuget рефами
От: Sаныч Таиланд  
Дата: 02.05.24 03:01
Оценка:
Здравствуйте, IT, Вы писали:

IT>Не оно? https://github.com/dotnet-script/dotnet-script?tab=readme-ov-file#nuget-packages-1


Примерно, но нет. Мне схожее нужно в своей программе, где код на шарпе прописывается. А тут отдельная среда. Если уж отдельная среда, тогда лучше студия.
Re[3]: C# как скрипт. Компиляция с nuget рефами
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 05.05.24 13:46
Оценка:
Здравствуйте, Sаныч, Вы писали:

S>Имелся ввиду подход с использованием CSharpCompilation. В этом случае добавление ссылок происходит через передачу путей к файлам. Конечно же, ссылки сохраняются не в коде напрямую, а в отдельном файле.

Понял.
Увы, ничего готового посоветовать не могу.
Судя по вот такому комментарию разработчики Roslyn считают что резолвинг зависимостей из NuGet — это не задача компилятора, а задача системы сборки.
Я попробовал поискать что-то готовое, но увы...

Нашел даже аналогичный вашему вопрос на stackoverflow, но там предлагается очень урезанный вариант — по сути просто явное скачивание NuGet пакета и извлечение из него нужной сборки. Т.е. не задействуется локальный кэш, не резолвится весь граф зависимостей, ...
А если делать по хорошему, то решение получается не особо простым.
Вообще по API NuGet буквально пару публикаций:
https://martinbjorkstrom.com/posts/2018-09-19-revisiting-nuget-client-libraries
— и циклы из 3 статей, на которые ссылаются из самой документации (а в документации вообще минимум примеров) https://learn.microsoft.com/en-us/nuget/reference/nuget-client-sdk#third-party-documentation

Может быть вам рассмотреть вариант с генерацией MsBuild проекта на лету и получения результатов через него? Это потребует, как минимум, наличия SDK на конечной машине (на сколько помню в Runtime пакет MSBuild не входит), но может дополнительные условия не такие уж и страшные?
Например, есть вот такой проект MSBuildProjectCreator, который на первый взгляд выглядит вполне живым и достаточно простым в использовании.
Re: C# как скрипт. Компиляция с nuget рефами
От: Разраб  
Дата: 06.05.24 13:15
Оценка:
Здравствуйте, Sаныч, Вы писали:

S>С обычными ясно через MetadataReference.CreateFromFile. С нугетами по сложнее — их же нужно сначата отрезолвить, скачать и только потом компилировать.


S>Какой то есть уже готовый класс для таких вещей?


есть лучше. F#

https://gist.github.com/altbodhi/de87b185f19ea895753c40208a8d607b
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: C# как скрипт. Компиляция с nuget рефами
От: Sаныч Таиланд  
Дата: 07.05.24 21:53
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>разработчики Roslyn считают что резолвинг зависимостей из NuGet — это не задача компилятора, а задача системы сборки.


Да я и не настаиваю на том, что это задача компилятора. Поэтому вопрос был скорее есть ли готовая вещь, которая умеет "подготавливать данные" для компиляции. Но видимо нет.

МР>Т.е. не задействуется локальный кэш, не резолвится весь граф зависимостей, ...


Вот-вот, поэтому и вопрос встал. Там ведь еще поиск совместимостей, если зависимости не полностью совместимы.

МР>Это потребует, как минимум, наличия SDK на конечной машине


А вот этого как раз и нет. Программа для пользователей. Как внутренний скрипт. Даже рантайм не всегда установлен, сделано авто скачивание. А в перспективе совсем перейти на AOT. Поэтому MsBuild не подходит никак.
Re: C# как скрипт. Компиляция с nuget рефами
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 08.05.24 07:47
Оценка:
Здравствуйте, Sаныч, Вы писали:

Package Management & improved .NET Aspire support come to C# Dev Kit
и солнце б утром не вставало, когда бы не было меня
Re[5]: C# как скрипт. Компиляция с nuget рефами
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 08.05.24 09:45
Оценка:
Здравствуйте, Sаныч, Вы писали:


S>А вот этого как раз и нет. Программа для пользователей. Как внутренний скрипт. Даже рантайм не всегда установлен, сделано авто скачивание. А в перспективе совсем перейти на AOT. Поэтому MsBuild не подходит никак.

А на сколько в такой схеме допустимо работать с произвольными NuGet-пакетами? Не будет ли тут потенциальных проблем?

Просто, например, если ограничить список библиотек, которые доступны пользователю, то задача может резко упроститься.
Например, можно поставлять в дистрибутиве все разрешенные библиотеки и более ничего.
Re: C# как скрипт. Компиляция с nuget рефами
От: RushDevion Россия  
Дата: 08.05.24 19:34
Оценка:
S>Какой то есть уже готовый класс для таких вещей?

Готового не встречал.

Но знаю, что есть пакет NuGet.Core (этот уже deprecated, но есть поновее), с помощью которого можно реализовать скачивание пакета с учётом всех зависимостей.

Идея такая: "исталируем" пакет со всеми зависимостями в известное место.
А в сгенерированную сборку добавляем обработчик для события assembly resolve домена. В обработчике ищем в папке инсталляции пакета требуемую сборку и возвращаем ее.

Вот тут можно посмотреть пример такой "установки" из нугета.
Это тоже сервер приложений, который умеет устанавливать и запускать приложения из нугет-пакетов. Типа такой docker на минималках
Проект тоже очень старый (еще под .net 4.x), ном может найдете что-то полезное для себя по части работы с нугет.
Отредактировано 09.05.2024 16:22 RushDevion . Предыдущая версия .
Re: C# как скрипт. Компиляция с nuget рефами
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 24.05.24 09:16
Оценка:
Здравствуйте, Sаныч, Вы писали:

Если не сложно, расскажите на каком варианте остановились в итоге.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.