Как загрузить из одной сборки другую сборку
Есть такой код получения типа из сборки.
Как мне загружать код через Assembly.Load() не прописывая полного пути, я когда пытаюсь так сделать прилетает ошибка следующего типа
System.IO.FileNotFoundException: 'Could not load file or assembly 'TextListener, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.'
public static IListener CreateListenerFromAssembly(string listenerName)
{
var assembly =
Assembly.LoadFrom(
$@"D:\NET02.3\{listenerName}\bin\Debug\netcoreapp3.1\{listenerName}");
var type = assembly.GetTypes()
.FirstOrDefault(type => typeof(IListener).IsAssignableFrom(type) && type.IsClass);
if (string.IsNullOrEmpty(type.FullName))
{
throw new NullReferenceException("Can't find this listener");
}
var listener = assembly.CreateInstance(type.FullName);
return (IListener) listener;
}
Ответы (1 шт):
Assembly.Load в .NET Core по умолчанию не грузит библиотеки из каталога с программой. Чтобы включить эту возможность нужно установить параметр Microsoft.NETCore.DotNetHostPolicy.SetAppPaths в runtimeconfig.json:
{
"runtimeOptions": {
"tfm": "netcoreapp2.1",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "2.1.0"
},
"configProperties": {
"System.GC.Server": true,
"Microsoft.NETCore.DotNetHostPolicy.SetAppPaths": true
}
}
}
Кроме того, если текущий каталог совпадает с каталогом программы, можно загрузить сборку без прописывания полного пути так:
Assembly.LoadFrom("Assembly.dll");
В общем случае, для загрузки сборки из каталога программы можно использовать вот такой код:
Assembly.LoadFrom(
Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location),"Assembly.dll")
);