我有一个使用Nancy并随后使用TinyIoC库的相当大(且不断增长)的应用程序。每个模块都与我的数据模型一起分解为单个项目,因此我的项目结构看起来像这样:
Solution |- NancyHost |- DataModels |- Modules.Common |- Modules.Dashboard |- Modules.Security |- Repositories
我遇到的问题是TinyIoC有一个AutoRegister
事件应该通过当前的AppDomain并注册所有"可注册的"类型。这很好,除了在启动时程序集尚未加载到app域,因为它使用DI来解析类型。
作为一种解决方法,我提出了这样的课程:
public static class RepositoryInitializer
{
public static void Initialize()
{
}
}
然后我在启动时从Main
调用,但我不喜欢这种方法,因为它要求我为每个链接的程序集创建一个虚拟的初始化程序类。我也可以这样做:
GC.KeepAlive(typeof(ReferencedAssembly.SomeType));
但同样,这要求我为每个引用的程序集添加相同的指令。
我以为我记得一些关于你可以应用于预加载引用程序集的程序集的硬绑定属性的东西?我找不到任何东西,但我发誓它就在那里。
我也试过这个:
static void Preload()
{
string location = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
List<Type> types = new List<Type>();
foreach (var dllFile in Directory.EnumerateFiles(location, "*.dll"))
{
types.AddRange(Assembly.ReflectionOnlyLoadFrom(dllFile).GetTypes());
}
var assemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
//assemblies does not contain all referenced assemblies
}
因为我读了一些关于使用会引起DLL加载的ReflectionOnlyLoadFrom
的内容,但这给了我一个例外,即必须预加载其他引用的DLL才能反映类型(如{{ 1}})。
所以问题是,如何在不使用对它们包含的类型的显式引用的情况下预加载引用的程序集?请注意System.Core
仅包含已加载程序集,而不是所有引用的程序集。
这有些重复,但没有任何帮助:Preload assemblies: referenced, unreferenced, not loaded until they are needed
修改
这是一个Assembly.GetReferencedAssemblies
的版本:
Assembly.Load
它会将程序集加载到 static void Preload()
{
string location = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var assemblies = new List<Assembly>();
foreach (var dllFile in Directory.EnumerateFiles(location, "*.dll"))
{
assemblies.Add(Assembly.Load(new AssemblyName() { CodeBase = dllFile }));
//Also tried Assembly.Load(File.ReadAllBytes(dllFile)), same effect
}
var refAssemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
}
列表中,但不会将它们加载到当前的应用程序域中。 (assemblies
在Assembly.GetReferencedAssemblies()
调用之前和之后返回相同的内容。