.NET Core 3의 MetadataLoadContext를 통해 사용할 수있는 현재 범위에서 어셈블리를로드하지 않고 특정 유형이있는 어셈블리를 검사하고 싶습니다.
그러나 다음 예제를 시도하면
internal static class Program
{
// ReSharper disable once UnusedParameter.Local
private static void Main(string[] args)
{
var paths = new string[] { @"Plugin.dll" };
var resolver = new PathAssemblyResolver(paths);
var pluginInterface = typeof(IPlugin);
using (var context = new MetadataLoadContext(resolver))
{
var assembly =
context.LoadFromAssemblyName(@"Plugin");
foreach (var type in assembly.GetTypes())
{
if (type.IsClass && pluginInterface.IsAssignableFrom(type))
Console.WriteLine("found");
}
}
}
}
나는 예외를 얻는다
System.IO.FileNotFoundException : 핵심 어셈블리를 찾을 수 없습니다. MetadataLoadContext 생성자에서 유효한 핵심 어셈블리 이름을 지정하거나 핵심 어셈블리를로드 할 수있는 MetadataAssemblyResolver를 제공합니다.
...에서 var context = new MetadataLoadContext(resolver)
코어 어셈블리는 무엇을 의미합니까? 아니면 내가 뭘 잘못하고 있니? https://blog.vincentbitter.nl/net-core-3-0/ 나를 위해 작동하지 않는 것 같습니다.
기존 답변이 저에게 효과적이지 않았습니다 (.NET Core 2.1). System.Runtime을 찾을 수 없다는 오류와 함께 실패합니다. System.Runtime에 대한 전체 경로를 하드 코딩하면 System.Private.CoreLib와 같은 다른 어셈블리에 대해 실패합니다. 또한 IsAssignableFrom을 통한 유형 검사는 한 유형이 MetadataLoadContext에서 제공되지 않을 때 작동하지 않는 것 같습니다.
어셈블리로드 오류에 대한 가능한 솔루션은 모든 BCL 어셈블리 ( RuntimeEnvironment.GetRuntimeDirectory 에서 반환 된 디렉터리의 모든 .dll 파일 )를 포함하는 것입니다. 모두가 실제로 관리되는 어셈블리는 아니지만 작동하는 것처럼 보이므로 다소 어리석은 느낌이 듭니다. 다음은 MetadataLoadContext를 통해 인터페이스를 구현하는 검색 유형의 전체 예입니다.
using System;
using System.IO;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.InteropServices;
namespace MetadataLoadContextSample
{
class Program
{
static int Main(string[] args)
{
string inputFile = @"Plugin.dll";
string[] runtimeAssemblies = Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll");
var paths = new List<string>(runtimeAssemblies);
paths.Add(inputFile);
var resolver = new PathAssemblyResolver(paths);
var context = new MetadataLoadContext(resolver);
using (context)
{
Assembly assembly = context.LoadFromAssemblyPath(inputFile);
AssemblyName name = assembly.GetName();
foreach (TypeInfo t in assembly.GetTypes())
{
try
{
if (t.IsClass && t.GetInterface("IPlugin") != null)
{
Console.WriteLine(t.Name);
}
}
catch (FileNotFoundException ex)
{
Console.WriteLine("FileNotFoundException: " + ex.Message);
}
catch (TypeLoadException ex)
{
Console.WriteLine("TypeLoadException: " + ex.Message);
}
}
}
Console.ReadLine();
return 0;
}
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다