- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
一段时间以来,我一直在努力与我的同事一起解决这个问题。
我使用 Ngen 来制作原生图像并提高我的应用程序在客户端上的性能。
假设 Exe 文件名为 Example.exe
我尝试在应用程序中做的是我做 ngen install example.exe,ngen 将为 assebmlies 安装 native 图像
然而问题来了:
如果我尝试使用提升的 CMD 并运行
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen Display example.exe
显示 example.exe 文件名和 native 图像的版本,但是,使用以下代码在 Windows 窗体 c# 中做同样的事情,它不显示 example.exe 文件的文件名和版本,并显示而不是依赖项,例如 Telerik 等。
所以我的问题是,为什么 CMD 返回正确的结果,而进程返回依赖项而不是文件名和版本本身?
这是我的一些代码:
public static bool Run()
{
var f = new Loading();
bool state = false;
var b = new BackgroundWorker();
string runtimeStr = RuntimeEnvironment.GetRuntimeDirectory();
string ngenStr = Path.Combine(runtimeStr, "ngen");
Process process = new Process
{
StartInfo =
{
FileName = ngenStr,
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = false
}
};
if (Environment.OSVersion.Version.Major >= 6)
{
process.StartInfo.Verb = "runas";
}
process.StartInfo.Arguments = "display " + Application.ProductName;
process.Start();
// process.WaitForExit();
string stdoutx = process.StandardOutput.ReadToEnd();
process.WaitForExit();
}
但是 stdoutx 字符串不包含 example.exe 文件名或版本
编辑:应该是什么的例子:
这是 cmd 返回的正确结果:
Example, Version=1.0.0.19, Culture=neutral, PublicKeyToken=null <debug>
这就是:
Microsoft (R) CLR Native Image Generator - Version 4.6.79.0
Copyright (c) Microsoft Corporation. All rights reserved.
NGEN Roots:
C:\Project\Example\bin\Debug\Example.EXE
NGEN Roots that depend on "Example":
C:\Project\Example\bin\Debug\Example.EXE
Native Images:
Klik.Windows.Forms.EntryLib.V2.2008, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null
Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
NCalc, Version=1.3.8.0, Culture=neutral, PublicKeyToken=973cde3f1cafed03
Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
RedGate.Migrations.Core, Version=1.0.0.1401, Culture=neutral, PublicKeyToken=7f465a1c156d4d57 <debug>
RedGate.Shared.ComparisonInterfaces, Version=1.0.2.278, Culture=neutral, PublicKeyToken=7f465a1c156d4d57
RedGate.Shared.SQL, Version=9.9.0.0, Culture=neutral, PublicKeyToken=7f465a1c156d4d57
RedGate.Shared.Utils, Version=9.9.0.0, Culture=neutral, PublicKeyToken=7f465a1c156d4d57
RedGate.SOCCompareInterface, Version=3.0.50.59, Culture=neutral, PublicKeyToken=7f465a1c156d4d57
RedGate.SQLCompare.ASTParser, Version=11.0.0.414, Culture=neutral, PublicKeyToken=7f465a1c156d4d57
RedGate.SQLCompare.Engine, Version=11.1.0.2, Culture=neutral, PublicKeyToken=7f465a1c156d4d57 <debug>
RedGate.SQLCompare.Rewriter, Version=11.1.0.2, Culture=neutral, PublicKeyToken=7f465a1c156d4d57
System.Configuration.Install, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Data.SQLite, Version=1.0.85.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139
System.Deployment, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Threading, Version=1.0.2856.102, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Telerik.Reporting, Version=9.0.15.324, Culture=neutral, PublicKeyToken=a9d7983dfcc261be
Telerik.ReportViewer.WinForms, Version=9.0.15.324, Culture=neutral, PublicKeyToken=a9d7983dfcc261be
Telerik.WinControls.ChartView, Version=2015.1.331.40, Culture=neutral, PublicKeyToken=5bb2a467cbec794e
Telerik.WinControls, Version=2015.1.331.40, Culture=neutral, PublicKeyToken=5bb2a467cbec794e
Telerik.WinControls.GridView, Version=2015.1.331.40, Culture=neutral, PublicKeyToken=5bb2a467cbec794e
Telerik.WinControls.Themes.Office2010Black, Version=2015.1.331.40, Culture=neutral, PublicKeyToken=5bb2a467cbec794e
Telerik.WinControls.Themes.Office2010Silver, Version=2015.1.331.40, Culture=neutral, PublicKeyToken=5bb2a467cbec794e
最佳答案
是的,您没有正确执行此操作。您正在使用的命令的语法是:
ngen.exe display [assemblyName | assemblyPath]
注意assemblyName 和assemblyPath 之间的区别。当您从 cmd.exe 运行它时,您键入“example”。从而指定了(部分)程序集名称。在您的代码中,您使用了“example.exe”。并且 Environment.CurrentDirectory 被意外正确设置,这是一个常见的意外。所以 Ngen.exe 可以找到 文件 并且它变得很健谈。不仅列出程序集名称,还列出其所有依赖项的 native 图像。像 Klik.Windows.Forms.EntryLib 等等。
这不是唯一的问题,请注意您指定了部分 程序集名称。您要确保程序集的特定 版本是 ngen-ed。让代码看起来像这样:
process.StartInfo.Arguments = "display \"" +
System.Reflection.Assembly.GetEntryAssembly().FullName + "\"";
然后使用“项目”>“属性”>“调试”选项卡对其进行测试 > 取消选中“启用 Visual Studio 托管进程”复选框。
次要担心的是 native 图像的位数(x86 与 x64)和提升您的应用程序以便您可以安装 native 图像,这通常只有在安装应用程序时才有机会。
关于c# - 在 C# winforms 中使用 Process.Start() 运行时,NGEN Display 返回与 Elevated CMD 不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33582717/
我想知道预 JIT 编译 (ngen.exe) 的好处。 Native Image Generator的作用是什么(NGen)过程以及为什么需要它? 请举个例子。 最佳答案 对于 .NET 平台上的代
我以前没有使用 NGen,但现在我需要提高我的 WPF 应用程序的启动性能。据我了解,常见情况是在应用程序安装期间运行 ngen 。但是我的应用程序用于满足公司内部需求并且没有安装程序(它只会使事情复
我正在尝试使用 NGen 来查看我的应用程序的 native 镜像是否比 .NET 镜像运行得更好。但是,我在弄清楚该怎么做时遇到了一些麻烦。 我的应用程序名为 MyApp.exe,它有几个依赖项 D
您可以使用 NGEN.EXE 将 MSIL 程序集编译为 native 程序集。但是当您有源代码时,您也可以在项目选项中选择“平台目标”。如果我在那里选择 x64,那与在 x64 机器上运行 NGEN
Ngen 能否用作完美的代码混淆器,保护您的 .NET CIL 永远不会到达客户端? 我可以在我的开发 PC 上运行 Ngen 并将 exe 发送到每个具有兼容的 .NET 框架版本的客户端吗? (假
因此,据我所知,它确实需要一个用 MSIL 编写的可执行文件/dll 文件。并执行 JIT 作业:将 MSIL 代码转换为 native 机器代码。正确的?所以跑了ngen使用以下命令生成我的程序的
NGen 对我的计算机不满意,我找不到方法来深入了解出了什么问题。 每次启动后,ngen 都会记录以下消息: .NET Runtime Optimization Service (clr_optimi
我从 this post 找到了一些关于使用 NGEN 作为安装程序的最后一步的有趣链接。 .是否有理由在设置时而不是在构建时首选 NGEN 您的程序集?我不是特别关心设置时间,但这似乎是一个不必要的
我有一个问题,这显然不是新问题,但我似乎仍然找不到答案。 我正在使用适用于 .NET 的 Google Analytics API,并且在尝试让程序集很好地协同工作时遇到了困难。当我通过 Visual
我的应用没有安装程序。它是可移植的,但我需要在其上运行 ngen.exe,因为它在启动时运行。 是否建议在应用程序首次运行时自动运行 ngen.exe?以后会不会出问题?有内置的方法吗? 最佳答案 是
我想在安装结束时执行 nGen,只是为了提高应用程序首次启动时的感知性能。我怎么能那样做?有一些最佳实践吗?我可以确定 nGen 始终与 .NET Framework 一起安装吗? 谢谢! 最佳答案
我正在尝试从 procmon 解码以下调用堆栈行: 29 System.Management.Automation.ni.dll System.Management.Automation.ni.dl
因此,当 CLR 运行时加载 .NET 程序集时,它会将其编译为机器 native 代码。这个过程称为 JITing。 NGen 也是将 .NET 程序集编译为 native 代码的过程。我不明白两者
当我们知道 ASP.NET 应用程序不会发生太大变化时,使用 NGEN 是否更好?或者 JIT 是否足够好? 我问的唯一原因是 this article by Jeffrey Richter 2002
我正在使用 NSIS 来部署 .Net 应用程序。安装/卸载过程工作正常,但我想添加最后的 ngen 步骤以提高启动性能。 不幸的是,谷歌没有透露任何相关 Material 。以前不太可能有人这样做过
我知道 Cosmos 和 SharpOS 已经制作了自己的编译器来从 C# 构建二进制代码,但是您可以使用 Microsoft 的 .NET AOT 来做同样的事情吗?将 C# 编译为 x86,即。我
我正在使用 Inno Setup为我的应用程序生成安装程序,我想写一个脚本到 NGen 我在安装过程中的应用程序。我希望代码能够 NGen 文件定位 x86 , x64 , 或 AnyCPU .我希望
我一直在开发一个 WinForms 应用程序,它有大约 5 个引用的程序集 - 由我们编写,以及大约 8 个由第三方引用的程序集(我们不希望将来更新它们,除非出现严重错误 - Infragistics
我在 C# 可执行文件上做了 Ngen。它成功了,但我无法弄清楚生成的文件在我的电脑中的什么位置。 MSDN 说它应该在 native 图像缓存中,但仍然无法弄清楚它在哪里.. 编辑:我想在上面运行
我如何确定是否正在使用 native 图像,而加载程序没有在运行时验证程序集的签名,甚至使用 GAC 的程序集? 我有一个复杂的系统,我们正在用 NGen 进行试验,但目前我们正在从所有 DLL 所在
我是一名优秀的程序员,十分优秀!