Как прочитать файл dll в проекте МауиC#

Место общения программистов C#
Ответить
Anonymous
 Как прочитать файл dll в проекте Мауи

Сообщение Anonymous »

У меня есть библиотека dll, назовем ее «LibraryA». Я прикрепил его к Application/Resources/Raw/LibraryA.dll. Я просто хочу зарегистрировать все службы и интерфейсы из этой библиотеки, например:

Код: Выделить всё

    public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiCommunityToolkit()
.UseMauiApp()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
fonts.AddFont("Roboto-Regular.ttf", "RobotoRegular");
fonts.AddFont("Roboto-Medium.ttf", "RobotoMedium");
fonts.AddFont("Roboto-Light.ttf", "RobotoLight");
})
;

RegisterServicesAsync(builder.Services);
builder.Services.AddSingleton();

var app = builder.Build();
return app;
}

private static void RegisterServices(IServiceCollection services)
{
string dllFileName = "LibraryA.dll";
var dllPath = Path.Combine(FileSystem.AppDataDirectory, dllFileName);

var assembly = Assembly.LoadFrom(dllPath);

var serviceTypes = assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && t.GetInterfaces().Any());

foreach (var implementationType in serviceTypes)
{
var interfaceType = implementationType.GetInterfaces().FirstOrDefault();
if (interfaceType != null)
{
var descriptor = services.FirstOrDefault(d => d.ServiceType == interfaceType);
if (descriptor != null)
{
services.Remove(descriptor);
}

services.AddSingleton(interfaceType, implementationType);
}
}
}
}
И возникает исключение, поскольку в пути нет файла LibraryA.dll:

Код: Выделить всё

'/data/user/0/com.application/files/LibraryA.dll'. Когда я копирую LibraryA.dll по этому пути, все работает. Но я не могу добиться этого с помощью
using var stream = await FileSystem.OpenAppPackageFileAsync(dllFileName);
using var fileStream = File.Create(dllPath);
await stream.CopyToAsync(fileStream);
, поскольку этот код является асинхронным и существует исключение System.Reflection.TargetInvocationException: «Исключение было создано целью вызова». потому что службы не зарегистрировались . Вот код копирования файла на устройство:

Код: Выделить всё

private static async Task RegisterServicesAsync(IServiceCollection services)
{
string dllFileName = "LibraryA.dll";
var dllPath = Path.Combine(FileSystem.AppDataDirectory, dllFileName);

****added code below****
using var stream = await FileSystem.OpenAppPackageFileAsync(dllFileName);
using var fileStream = File.Create(dllPath);
await stream.CopyToAsync(fileStream);
**********************

var assembly = Assembly.LoadFrom(dllPath);

var serviceTypes = assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && t.GetInterfaces().Any());

foreach (var implementationType in serviceTypes)
{
var interfaceType = implementationType.GetInterfaces().FirstOrDefault();
if (interfaceType != null)
{
var descriptor = services.FirstOrDefault(d => d.ServiceType == interfaceType);
if (descriptor != null)
{
services.Remove(descriptor);
}

services.AddSingleton(interfaceType, implementationType);
}
}
}
Следует ли копировать LibraryA.dll на устройство Android вручную? Как мне с этим справиться?


Подробнее здесь: https://stackoverflow.com/questions/791 ... ui-project
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»