我正在Inno Setup为我的应用程序生成安装程序,我想在安装过程中为我的应用程序编写一个脚本到NGen。我想要的代码能够NGEN文件目标x86,x64或AnyCPU。我希望能够在和系统上使用NGen。我怎样才能做到这一点?32bit64bit
我找到了几个有用的链接:
获取 .NET Framework 目录路径
http://nsis.sourceforge.net/Get_directory_of_installed_.NET_runtime
我发现这是一个相当复杂的问题 - 最多可以有 4 个不同的版本的NGEN应用:
由于该应用程序可以针对 32 位 CPU 并在 64 位系统上运行,因此情况更加复杂。
所以我想到的是一个看起来像这样的函数:
function NGenFile(file: String; targetCPU: TTargetCPU; targetCLR: TTargetCLR): Boolean;
Run Code Online (Sandbox Code Playgroud)
并[Code]在成功安装后调用它:
NGenFile(ExpandConstant('{app}\application.exe'), tcpu64, tclr20);
NGenFile(ExpandConstant('{app}\library1.dll'), tcpu64, tclr40); …Run Code Online (Sandbox Code Playgroud) 我想NGEN.EXE在创建安装程序之前使用以生成程序集的本机映像.我希望这能保持我的二进制文件Reflector.我对此是否正确?
我刚刚了解到所有本机映像现在都存储在本机映像缓存中.有没有办法获得本机二进制文件,然后我可以使用安装程序打包?另一方面,生成本机图像后是否可以摆脱原始组件?
编辑:我正在使用一个应用程序,它与服务器通信时使用硬编码密钥进行加密.使用.NET,人们可以轻松地将钥匙放在钥匙上.
我们在安装过程中使用 NGen 来优化应用程序的启动时间。
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
...
<File Id="File.$(var.ProjectName.TargetName).exe" Source="$(var.ProjectName.TargetPath)" KeyPath="yes">
<netfx:NativeImage Id="ngen.File.$(var.ProjectName.TargetName)" Platform="$(var.NgenPlatform)" Priority="0" AppBaseDirectory="INSTALLLOCATION"/>
</File>
...
</Wix>
Run Code Online (Sandbox Code Playgroud)
在安装生成的 MSI 时,与其他步骤相比,“删除备份文件”步骤花费了非常长的时间。深入研究,我们发现当时 NGen 正在运行。
我们怎么能在那里写点别的东西,比如“我们现在在你的应用程序每次启动时为你节省了很多时间”?
我发现使用NGEN从在安装最后一步了几个有趣的链接这一职位.有没有理由在建立时而不是在构建时NGEN你的程序集?我并不特别关心设置时间,但它似乎是一个不必要的步骤,可以通过我的构建自动化.
我在维基百科关于CLR的文章中阅读了以下段落:
或者,可以通过使用本机映像生成器(NGEN)在运行之前在单独的步骤中将CIL代码编译为本机代码.由于不再需要CIL到本机编译,这加速了软件的所有后续运行.
这是否意味着我可以使用任何.NET程序并将其编译为二进制文件,然后该二进制文件将能够在没有安装.NET框架的机器上运行?
据我所知,Cosmos和SharpOS已经制作了自己的编译器来构建C#的二进制代码,但是你可以使用Microsoft的.NET AOT来做同样的事情吗?将C#编译为x86,即.我假设您将不得不遗漏使用语句,就像包含语句时的OS开发一样.任何反馈意见.谢谢
编辑:我想在内核开发中使用C#的主要原因是托管代码带来的内存管理,特别是单地址空间属性.是否有必要引导JIT编译器,然后编译C#?或者那时的环境是否仍然过于瘫痪?感谢您的反馈
Ngen可以用作完美的代码混淆器,保护您的.NET CIL不会到达客户端吗?
我可以在我的开发PC上运行Ngen并将exe发送给具有兼容的.NET框架版本的每个客户端吗?(假设两者都是x86或x64)Ngen'd exe跨机器有什么区别?
我知道最新的Ngen生成一个包含IL + Native代码的exe,可以使用Reflector之类的东西将其提取并"转换"回源代码.但是,.NET Framework 1.1 的ngen 删除了生成的exe中的IL,如果使用.NET framework 1.1,它可以作为代码安全性的可能选择.
我的应用没有安装程序.它是可移植的,但我需要运行ngen.exe它,因为它在启动时运行.
是否建议ngen.exe首次运行应用程序时自动运行?以后会引起任何问题吗?有内置的方法吗?
如果您不了解Phoenix,它是Microsoft的编译器框架,它可以成为所有新编译器的基础.它可以从CIL,x86,x64和IA64读取代码; 并在x86,x64,IA64或CIL中发出代码.
我可以使用它将纯.Net应用程序转换为纯本机应用程序吗?我的意思是,它不必加载任何.Net .dll(甚至不是mscoree),并且将具有相同的语义?当然,这不包括反思.
我用C#用.NET框架编写windows应用程序.如何减少这些应用程序的启动时间?我的应用程序在启动和初始化期间感觉非常慢,特别是在显示初始表单时.
我的应用程序使用Access(MDB)数据库来保存数据.在某些形式中,它会加载数据,但是第一次应用程序显示任何给定的表单时,显示需要很长时间.
我已经尝试使用NGen来减少启动时间,但它并没有像我预期的那样帮助我.
在更新后使用我们的MVC Web应用程序时,首次加载主页需要几分钟时间.第一次加载后,加载速度非常快.可能MSIL代码被编译为Native Machine代码并被缓存.(如我错了请纠正我).每个页面都会出现这种情况.
每次将新版本复制到服务器时都会非常慢.为了解决这个问题,我试图用ngen进行pre-jit编译,这样我们就可以为用户节省大量时间.但是当对它的项目bin文件夹中的每个dll执行"ngen install mydll.dll"时,它会给我带来一些错误.这是命令
cd "C:\Windows\Microsoft.NET\Framework64\v4.0.30319"
for %%i in (C:\inetpub\wwwroot\myproject\bin\*.dll) do ngen install "%%i"
Run Code Online (Sandbox Code Playgroud)
第一个错误是:
Failed to load dependency System.Web.Mvc of assembly DotNetOpenAuth.Core,
Version=4.3.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246 because of the following error : The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Failed to load dependency log4net of assembly DotNetOpenAuth.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246 because of the following error : The system cannot find the file specified. (Exception from HRESULT: 0x80070002)
Run Code Online (Sandbox Code Playgroud)
该项目只是调试和构建良好.实现这一目标的正确方法是什么?
我正在努力研究ngen和泛型集合.我已经在解决方案中使用了所有程序集,但是每当我的应用程序执行该代码时,仍会以某种方式进行jitting:
private Dictionary<int, bool> VerifyedFunc;
public SecurityProvider()
{
...
VerifyedFunc = new Dictionary<int, bool>();
...
}
Run Code Online (Sandbox Code Playgroud)
MDA消息:
Managed Debugging Assistant 'JitCompilationStart' has detected a problem in '*.exe'.
Additional Information:
<mda:msg xmlns:mda="http://schemas.microsoft.com/CLR/2004/10/mda">
<mda:jitCompilationStartMsg break="true">
<method name="mscorlib!System.Collections.Generic.Dictionary`2::.ctor"/>
</mda:jitCompilationStartMsg>
</mda:msg>
Run Code Online (Sandbox Code Playgroud)
NGen和泛型集合是否存在一些问题?
ngen ×13
.net ×8
c# ×6
asp-classic ×1
asp.net-mvc ×1
build ×1
clr ×1
compilation ×1
gac ×1
inno-setup ×1
installation ×1
jit ×1
native ×1
obfuscation ×1
optimization ×1
osdev ×1
performance ×1
security ×1
startup ×1
vb.net ×1
winforms ×1
wix ×1