Загрузка сборки во время выполнения для .NET и .NET FrameworkC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Загрузка сборки во время выполнения для .NET и .NET Framework

Сообщение Anonymous »

У меня есть библиотека класса NetStandard20 и консольное приложение, которое не имеет прямой ссылки на эту библиотеку классов. Вместо этого мне нужно загрузить эту библиотеку во время выполнения, чтобы типы могли быть решены правильно. На данный момент мое консольное приложение предназначено для Net8.0 , и я делаю это следующим образом:

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

using System;
using System.IO;
using System.Reflection;
using System.Runtime.Loader;

namespace AssemblyResolveTest
{
internal class Program
{
static void Main(string[] args)
{
//if I uncomment this line typeSecondAttempt would be null below
//var typeFirstAttempt = Type.GetType("DataClasses.TestDataClass");

var path = Path.Combine(Directory.GetCurrentDirectory(), "DataClasses.dll");
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(path);

var typeSecondAttempt = Type.GetType("DataClasses.TestDataClass, DataClasses");
}
}
Моя первая проблема - почему, если у меня нерешенное значение typrefirstAttment typeecondAttempt становится null (не может быть разрешено)? там. Есть Nuget, но он работает, когда называется только из .NET (но мне также нужно поддерживать .NET Framework). Единственный подход, который я знаю, это appdomain.currentdomain.assemblyresolve , как это:

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

using System;
using System.IO;
using System.Reflection;

namespace AssemblyResolveTestClassLibrary
{
public static class AssemblyResolver
{
static AssemblyResolver()
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}

private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (new AssemblyName(args.Name).Name == "DataClasses")
{
var path = Path.Combine(Directory.GetCurrentDirectory(), "DataClasses.dll");
return Assembly.LoadFile(path);
}
else
return null;
}

public static Type GetTestDataClassType()
{
return Type.GetType("DataClasses.TestDataClass, DataClasses");
}
}
}
, но Assembly.loadfile (path) выполняется каждый раз, когда я вызову assblyresolver.getTestDataClasStype () . Моя цель - загрузить сборку один раз - как это достичь? Может быть, какая -то другая функция appdomain.currentdomain ?
Спасибо.
обновление - разъяснение моего проекта реальная структура (упрощенная):
Interfaces - NetStandard20 Библиотека. Допустим, это имеет: < /p>

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

public interface ISampleResult
{
Guid Id { get; }
}
public interface ISampleService
{
ISampleResult GetSampleResult();
}
dataClasses - NetStandard20 библиотека, ссылки интерфейсы библиотека. Допустим, это имеет: < /p>

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

public class SampleResult(Guid id) : ISampleResult
{
public Guid Id { get; } = id;
}
server - net8.0 Библиотека классов, которая фактически выполняет операции, объявлено в интерфейсах. Он ссылается на интерфейсы и dataClass библиотеки. Допустим, это имеет: < /p>

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

public class SampleService : ISampleService
{
public ISampleResult GetSampleResult()
{
return new SampleResult(Guid.Empty);
}
}
ipc - netstandard20 библиотека, ссылки интерфейсы библиотека и Newtonsoft.json Nuget. Это библиотека для межпроцессной связи: плагины (могут быть net472 или net8.0+, эта ссылка Interfaces библиотека) отправляет запрос func , который фактически выполняется на сервере, и получить ответ с результатом. Запросы/ответы отправляются как JSON. Допустим, запросы плагинов isampleservice.getsampleresult () - Когда Newtonsoft.json пытается десериализировать ответ с сервера, он не удается, потому что IPC ничего не знает о dataClass . Вот почему мне нужно обнаружить такие ситуации и загрузить dataClasses библиотека во время выполнения (но только один раз).
Не стесняйтесь задавать вопросы, если я недостаточно уточнил.

Подробнее здесь: https://stackoverflow.com/questions/797 ... -framework
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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