C# 预加载引用的程序集
我已经有了一个相当大(而且还在增长)的应用程序,它使用TinyIoC库。每个模块与我的数据模型一起被分解成单独的项目,因此我的项目结构看起来有点像这样: Solution |- NancyHost |- DataModels |- Modules.Common |- Modules.Dashboard |- Modules.Security |- RepositoriesC# 预加载引用的程序集,c#,.net-assembly,preloading,C#,.net Assembly,Preloading,我已经有了一个相当大(而且还在增长)的应用程序,它使用TinyIoC库。每个模块与我的数据模型一起被分解成单独的项目,因此我的项目结构看起来有点像这样: Solution |- NancyHost |- DataModels |- Modules.Common |- Modules.Dashboard |- Modules.Security |- Repositories public static class RepositoryInitializer { pu
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
}
它会将程序集加载到
程序集
列表中,但不会导致将它们加载到当前应用程序域中。(Assembly.getReferencedAssemblys()
在预加载调用前后返回相同的值) Assembly.Load
是您实际需要的。@SLaks如何将其加载到当前应用程序域中?所有的Assembly.Load
重载都有一个程序集名称,假设我没有将它们全部硬编码,我如何确定哪些是可执行文件引用的?只需从每个DLL文件名构造一个AssemblyName
。@SLaks我应该对返回的程序集做些特殊的处理吗?Assembly.Load(byte[])
表示它被加载到调用者应用程序域中,但是(请参见我的编辑),它看起来不像这样,因为对getReferenceAssemblys()
的调用在Preload
getReferenceAssemblys()
之前和之后都是相同的。未使用的引用在编译时被剥离。加载程序集将永远不会更改getReferenceAssemblys()
Assembly的结果。加载
是您真正想要的。@SLaks如何将其加载到当前应用程序域?所有的Assembly.Load
重载都有一个程序集名称,假设我没有将它们全部硬编码,我如何确定哪些是可执行文件引用的?只需从每个DLL文件名构造一个AssemblyName
。@SLaks我应该对返回的程序集做些特殊的处理吗?Assembly.Load(byte[])
表示它被加载到调用者应用程序域中,但是(请参见我的编辑),它看起来不像这样,因为对getReferenceAssemblys()
的调用在Preload
getReferenceAssemblys()
之前和之后都是相同的。未使用的引用在编译时被剥离。加载程序集永远不会更改GetReferencedAssemblys()
的结果。
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();
}