Проведя дальнейшее исследование, я пришел к выводу, что моя проблема в том, что моя внешняя библиотека не связана должным образом с зависимостями mono.net. Вот почему, когда вы создаете приложение Blazor, оно компилируется во второй раз в /dist/_framework/_bin.
Я нашел три возможных решения этой проблемы:
Таким образом, ваше приложение будет автоматически преобразовано в моно -совместимая сборка при сборке. Простой взгляд на Blazor .csproj показывает зависимости, необходимые для достижения этой цели. Чтобы это работало, мне пришлось изменить .csproj моей внешней сборки:
из стандартной библиотеки нестандартных файлов:
netstandard2.0
в веб-приложение:
netstandard2.0
dotnet
7.3
[ 1119] Это единственные необходимые зависимости. При сборке совместимая сборка будет находиться в папке / dist / _framework / _bin. Затем его можно загрузить, используя методы, описанные в вопросе.
Этот работает , но чувствует себя немного хакерским, потому что единственная причина, по которой мы превращаем библиотеку в веб-приложение, состоит в том, что она может скомпилировать себя в правильно связанную сборку.
Другое решение - разархивировать пакет Nuget из Microsoft.AspNetCore.Blazor.Build и взять файл netstandard.dll. Он находится в папке tools\mono\bcl\Facades
. Теперь, когда в основном приложении Blazor выполняется следующее:
var netstandard = await client.GetByteArrayAsync("http://localhost:62633/_framework/netstandard.dll");
var externallib = await client.GetByteArrayAsync("http://localhost:62633/_framework/MyCustomLib.dll");
AppDomain.CurrentDomain.Load(netstandard);
var assembly = AppDomain.CurrentDomain.Load(externallib);
, библиотека немодифицированной netstandard 2.0 MyCustomLib
будет загружена без ошибок.
Инструменты Blazor Build, которые в настоящее время находятся здесь здесь , имеют команду ResolveRuntimeDependenciesCommand
для CLI, которая, кажется, делает именно то, что нужно. веб-приложение Blazor делает, когда оно выводит вывод в / _framework / _bin Я все еще смотрю на то, как это можно использовать для преобразования сборки «non blazor-webapp» в моносовместимую.
Не стесняйтесь комментировать или отвечать с дополнительной информацией. Я оставляю этот вопрос открытым, пока не будет найдено «более чистое» решение.
Если Вы не хотите создавать целый проект только для дополнительных методов, можно связать тот же файл в отдельные проекты, не копируя файл:
Лучший подход должен поместить их всех в единственный проект и создать DLL. Можно затем включать тот проект как ссылку проекта или включать DLL как двоичную ссылку (вероятно, лучший выбор).
Вы могли поместить свои расширения в отдельный проект и включать тот проект в каждое новое решение, которое Вы делаете.
Просто будьте осторожны относительно управления версиями, например, когда другие приложения пытаются делать изменения в Ваш дополнительный проект затем всеми проектами, которые используют тот метод, должен быть повторно протестирован.
Scott Dorman корректен в своем сообщении также: если Вы не хотите их, изменился, можно скомпилировать их как, библиотека DLL, которую Вы включаете в свои новые проекты (в противоположность включению нескомпилированного проекта).
Создайте проект для своих расширений платформы.NET и ссылку что один проект в каждом из Ваших проектов приложения.Само собой разумеется: любой и весь материал платформы и только материал платформы, входят в тот один проект; материал приложения входит в Ваши проекты приложения.
Вы могли бы также изучить различные библиотеки платформы там, такие как Зонтик, которые предлагают комплекты расширений базовой платформы.