Загрузка сборки во время выполнения для .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 ?
Спасибо.

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

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

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

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

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

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

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