实际上我试图在我的解决方案中实现某种"静态链接"程序集.所以我尝试了以下内容:
private MyObject temp = new MyObject();在这些步骤之后,我按预期得到了FileNotFoundException.因此,让我们尝试使用此快速入侵在AssemblyResolveEvent中加载程序集
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
{
Assembly MyAssembly = AppDomain.CurrentDomain.Load(Properties.Resources.ExternalAssembly);
return MyAssembly;
};
Run Code Online (Sandbox Code Playgroud)
这样可行!我可以从AssemblyResolveEvent中的资源文件加载我的程序集.但是这个事件只会发生,如果它无法在其他任何地方找到我的组件.但是我怎么能在 .Net尝试搜索不同的地方之前加载我的程序集?
由于检查先前引用的程序集的事实,我认为可以预先将程序集加载到域中,这将被采用.
我在program.cs中使用以下Main()方法尝试了这个
static void Main()
{
LoadMyAssemblies();
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => LoadMyAssemblies();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static Assembly LoadMyAssemblies()
{
Assembly result = AppDomain.CurrentDomain.Load(Properties.Resources.MyStaticAssembly);
return result;
}
Run Code Online (Sandbox Code Playgroud)
但它仍会运行到ResolveEventHandler中.更好的是,如果我再次加载程序集并查看AppDomain.CurrentDomain.GetAssemblies()我可以看到我的程序集加载了两次!!
所以任何想法为什么加载程序集在AssemblyResolve事件之前加载时不会被考虑在内?在调试器的帮助下,当调用来自AssemblyResolve时,我也返回了null,但是在这种情况下,我在开头时得到了一个FileNotFoundException.
我们有一个包含大约 50 个程序集(DLL 文件)的产品,其中大部分是在主可执行文件启动时需要和加载的。结果是即使在中等速度的机器上,加载程序集和对其进行 JIT 的时间也需要 2-3 秒,这在我们的情况下是不可接受的开销。
如果我们加载一次程序并从同一个仍在运行的可执行文件中多次运行它,则计时从几毫秒开始。但对于最终用户来说,这不是一个选项,他们将从命令行运行它。
我想在第一次实例化可执行文件时加快加载速度。冷启动(重新启动 Windows 后)和热启动之间有一个小的加速,但只是略微加速。我们可以使用 .NET 中哪些技术或工具来加速加载(注意:我们尝试了 ILMERGE,它只能帮助大约 30%,而 NGEN 不是一个选项,它需要在各种系统和架构上运行)。
我正在考虑创建一个服务和/或一个特定的 CLR 托管环境,但希望有一个更简单、更琐碎的解决方案。我还没有尝试过 GAC。