Проведя дальнейшее исследование, я пришел к выводу, что моя проблема в том, что моя внешняя библиотека неправильно связана с зависимостями mono.net.Вот почему, когда вы создаете приложение Blazor, оно во второй раз компилируется в /dist/_framework/_bin.
Я нашел три возможных решения этой проблемы:
1.Превратите внешнюю библиотеку классов в веб-приложение Blazor
Таким образом, ваше приложение будет автоматически преобразовано в моносовместимую сборку при сборке.Простой взгляд на Blazor .csproj показывает зависимости, необходимые для достижения этой цели.Чтобы это работало, мне пришлось изменить .csproj моей внешней сборки:
из стандартной библиотеки нестандартных файлов:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
в веб-приложение:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RunCommand>dotnet</RunCommand>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Blazor.Build" Version="0.7.0" PrivateAssets="all" />
</ItemGroup>
</Project>
Это единственные необходимые зависимости.При сборке совместимая сборка будет находиться в папке / dist / _framework / _bin.Затем его можно загрузить, используя методы, описанные в вопросе.
Этот работает , но выглядит немного странно, потому что единственная причина, по которой мы превращаем библиотеку в веб-приложение, заключается в том, чтоон может скомпилировать себя в правильно связанную сборку.
2. Загрузить моно-фасад netstandard2.0
Другое решение - разархивировать пакет 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
будет загружена без ошибок.
- Нет необходимости менять его на веб-приложение
- Это работает , но оно выглядит даже более хакерным, чем первое решение, не зная, произойдет ли это позже на этом пути ...
3. Используйте инструменты Blazor Build
Инструменты Blazor Build, в настоящее время найденные здесь , у них есть команда ResolveRuntimeDependenciesCommand
для CLI, которая, кажется, делает именно то, чтовеб-приложение Blazor делает, когда оно выводит вывод в / _framework / _bin.Я все еще смотрю на то, как это можно использовать для преобразования сборки «non blazor-webapp» в моносовместимую.
Не стесняйтесь комментировать или отвечать с дополнительной информацией.Я оставляю этот вопрос открытым, пока не будет найдено «более чистое» решение.