Я получаю исключение при динамической загрузке библиотеки классов .netstandard2.0 из консольного приложения .netcoreapp3.1, когда вызываемая мной функция ссылается на зависимость NuGet (в данном случае NInject.3.4.4, но не какая библиотека актуальна).
Это код вызывающего консольного приложения .netcoreapp3.1:
using ServicePluginInterface;
class Program
{
static void Main(string[] args)
{
var path = @"C:\path\to\assembly\EmailPlugin.dll";
var assembly = Assembly.LoadFile(path);
var classType = assembly.GetTypes()
.Where(x => typeof(IMyTask).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract)
.Select(x => x).FirstOrDefault();
var myInstance = (IMyTask)Activator.CreateInstance(classType);
myInstance.ExecuteTask();
}
Это класс, который я создаю (динамически) из библиотеки классов и функции, в которой я вызываю загруженная сборка (EmailPlugin.dll):
using ServicePluginInterface;
namespace EmailPlugin
{
/// <summary>
/// A class that implements the "dummy.alpha" task
/// </summary>
public class EmailLoginTask : IMyTask
{
public void ExecuteTask()
{
//IKernel kernel = new StandardKernel();
//kernel.Bind<ClassLibNinjectModule>();
// Sample placeholder code
int a = 1;
int b = a * a;
}
}
}
Вызывающее приложение может успешно загрузить сборку, найти и построить класс EmailLoginTask
и без проблем вызвать метод ExecuteTask()
, как показано выше.
Однако, как только я раскомментирую материал IKernel
(добавив using в NInject
et c.), Я получаю следующее исключение для вызывающего приложения в строке myInstance.ExecuteTask()
:
'myInstance.ExecuteTask ()' выдал исключение типа 'System.IO.FileNotFoundException' Data: {System.Collections.ListDictionaryInternal} FileName: «Ninject, Version = 3.3.4.0, Culture = нейтральный, PublicKeyToken = c7192dc5380945e7 "FusionLog:" "HResult: -2147024894 HelpLink: null InnerException: null Сообщение:" Не удалось загрузить файл или сборку Ninject, версия = 3.3.4.0, культура = нейтральная, PublicKeyTo ken = c7192dc5380945e7 '. Система не может найти указанный файл. "Источник:" EmailPlugin "StackTrace:" в EmailPlugin.EmailLoginTask.ExecuteTask (null) в C: \ ... \ EmailLoginTask.cs: line 31 "TargetSite: {Void ExecuteTask (null )}
Сборка NInject находится в той же папке. Вот список папок:
28/05/2020 14:13 7,680 ActivbaseServicePluginInterface.dll
28/05/2020 14:13 1,748 ActivbaseServicePluginInterface.pdb
28/05/2020 14:13 8,417 EmailPlugin.deps.json
28/05/2020 15:17 4,608 EmailPlugin.dll
28/05/2020 15:17 988 EmailPlugin.pdb
13/11/2017 04:01 137,728 Ninject.dll
26/05/2020 10:46 50,688 RSPlatform.Common.dll
26/05/2020 10:46 148,992 RSPlatform.Common.pdb
28/05/2020 14:13 27,648 RSPlatform.Mail.dll
28/05/2020 14:13 130,560 RSPlatform.Mail.pdb
11/09/2019 13:04 22,960 System.Reflection.Emit.ILGeneration.dll
11/09/2019 13:04 22,952 System.Reflection.Emit.Lightweight.dll
Я проверил Ninject.dll
, и это правильная версия, strong named, et c.
EmailPlugin.deps.json
тоже правильно ссылается на NInject.
Как мне заставить сборку загружать зависимости библиотеки классов?
ПРИМЕЧАНИЕ: И родительская сборка, и библиотека классов ссылаются на общую библиотеку классов, которая определяет интерфейс IMyTask
. Действительно, все это отлично работает, когда NInject не упоминается в функции.
Вот копия EmailPlugin.deps.json
файл:
"runtimeTarget": {
"name": ".NETStandard,Version=v2.0/",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETStandard,Version=v2.0": {},
".NETStandard,Version=v2.0/": {
"EmailPlugin/1.0.0": {
"dependencies": {
"ActivbaseServicePluginInterface": "1.0.0",
"NETStandard.Library": "2.0.3",
"Ninject": "3.3.4",
"RSPlatform.Mail": "1.0.0"
},
"runtime": {
"EmailPlugin.dll": {}
}
},
"Microsoft.NETCore.Platforms/1.1.0": {},
"Microsoft.NETCore.Targets/1.1.0": {},
"NETStandard.Library/2.0.3": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.0"
}
},
"Ninject/3.3.4": {
"dependencies": {
"System.Reflection.Emit.ILGeneration": "4.3.0",
"System.Reflection.Emit.Lightweight": "4.3.0"
},
"runtime": {
"lib/netstandard2.0/Ninject.dll": {
"assemblyVersion": "3.3.4.0",
"fileVersion": "3.3.4.0"
}
}
},
"System.IO/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.0",
"Microsoft.NETCore.Targets": "1.1.0",
"System.Runtime": "4.3.0",
"System.Text.Encoding": "4.3.0",
"System.Threading.Tasks": "4.3.0"
}
},
"System.Reflection/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.0",
"Microsoft.NETCore.Targets": "1.1.0",
"System.IO": "4.3.0",
"System.Reflection.Primitives": "4.3.0",
"System.Runtime": "4.3.0"
}
},
"System.Reflection.Emit.ILGeneration/4.3.0": {
"dependencies": {
"System.Reflection": "4.3.0",
"System.Reflection.Primitives": "4.3.0",
"System.Runtime": "4.3.0"
},
"runtime": {
"lib/netstandard1.3/System.Reflection.Emit.ILGeneration.dll": {
"assemblyVersion": "4.0.2.0",
"fileVersion": "4.6.24705.1"
}
}
},
"System.Reflection.Emit.Lightweight/4.3.0": {
"dependencies": {
"System.Reflection": "4.3.0",
"System.Reflection.Emit.ILGeneration": "4.3.0",
"System.Reflection.Primitives": "4.3.0",
"System.Runtime": "4.3.0"
},
"runtime": {
"lib/netstandard1.3/System.Reflection.Emit.Lightweight.dll": {
"assemblyVersion": "4.0.2.0",
"fileVersion": "4.6.24705.1"
}
}
},
"System.Reflection.Primitives/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.0",
"Microsoft.NETCore.Targets": "1.1.0",
"System.Runtime": "4.3.0"
}
},
"System.Runtime/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.0",
"Microsoft.NETCore.Targets": "1.1.0"
}
},
"System.Text.Encoding/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.0",
"Microsoft.NETCore.Targets": "1.1.0",
"System.Runtime": "4.3.0"
}
},
"System.Threading.Tasks/4.3.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "1.1.0",
"Microsoft.NETCore.Targets": "1.1.0",
"System.Runtime": "4.3.0"
}
},
"ActivbaseServicePluginInterface/1.0.0": {
"runtime": {
"ActivbaseServicePluginInterface.dll": {}
}
},
"RSPlatform.Mail/1.0.0": {
"runtime": {
"RSPlatform.Mail.dll": {}
}
},
"RSPlatform.Common/1.0.0.0": {
"runtime": {
"RSPlatform.Common.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
}
}
},
"libraries": {
"EmailPlugin/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.NETCore.Platforms/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==",
"path": "microsoft.netcore.platforms/1.1.0",
"hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512"
},
"Microsoft.NETCore.Targets/1.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==",
"path": "microsoft.netcore.targets/1.1.0",
"hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512"
},
"NETStandard.Library/2.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==",
"path": "netstandard.library/2.0.3",
"hashPath": "netstandard.library.2.0.3.nupkg.sha512"
},
"Ninject/3.3.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-CmbWW97FfJuh4LEOVZM/spqXl4KAulRUjqeMwRd5J9rDMQArmIYaDMU3pyzXXHT062tbF0OPIMwI7tSOtprPfg==",
"path": "ninject/3.3.4",
"hashPath": "ninject.3.3.4.nupkg.sha512"
},
"System.IO/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
"path": "system.io/4.3.0",
"hashPath": "system.io.4.3.0.nupkg.sha512"
},
"System.Reflection/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
"path": "system.reflection/4.3.0",
"hashPath": "system.reflection.4.3.0.nupkg.sha512"
},
"System.Reflection.Emit.ILGeneration/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==",
"path": "system.reflection.emit.ilgeneration/4.3.0",
"hashPath": "system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512"
},
"System.Reflection.Emit.Lightweight/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==",
"path": "system.reflection.emit.lightweight/4.3.0",
"hashPath": "system.reflection.emit.lightweight.4.3.0.nupkg.sha512"
},
"System.Reflection.Primitives/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
"path": "system.reflection.primitives/4.3.0",
"hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512"
},
"System.Runtime/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
"path": "system.runtime/4.3.0",
"hashPath": "system.runtime.4.3.0.nupkg.sha512"
},
"System.Text.Encoding/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
"path": "system.text.encoding/4.3.0",
"hashPath": "system.text.encoding.4.3.0.nupkg.sha512"
},
"System.Threading.Tasks/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
"path": "system.threading.tasks/4.3.0",
"hashPath": "system.threading.tasks.4.3.0.nupkg.sha512"
},
"ActivbaseServicePluginInterface/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"RSPlatform.Mail/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"RSPlatform.Common/1.0.0.0": {
"type": "reference",
"serviceable": false,
"sha512": ""
}
}
}
Я потратил около двух часов, пытаясь получить информацию из «fuslogvw.exe», но не подвожу нигде с этим (в FileNotFoundException
упорно отказывается заполнять свойство FusionLog; при запуске Fusiosn LogViewer в режиме администратора, он не показывает ничего значимого или значимого в контексте приложения)
В принципе, почему NInject не разрешается, когда он находится в той же папке, что и библиотека классов и строгое имя соответствует?
Спасибо, Крис