C# 预加载引用的程序集

C# 预加载引用的程序集,c#,.net-assembly,preloading,C#,.net Assembly,Preloading,我已经有了一个相当大(而且还在增长)的应用程序,它使用TinyIoC库。每个模块与我的数据模型一起被分解成单独的项目,因此我的项目结构看起来有点像这样: Solution |- NancyHost |- DataModels |- Modules.Common |- Modules.Dashboard |- Modules.Security |- Repositories public static class RepositoryInitializer { pu

我已经有了一个相当大(而且还在增长)的应用程序,它使用TinyIoC库。每个模块与我的数据模型一起被分解成单独的项目,因此我的项目结构看起来有点像这样:

Solution |- NancyHost |- DataModels |- Modules.Common |- Modules.Dashboard |- Modules.Security |- Repositories
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();
    }