我一直在试图与我的同事一起解决这个问题。
我使用Ngen制作本机图像,并提升客户端上的应用程序性能。
让我们假设Exe文件名是Example.exe
我试图在应用程序中做的是,我做ngen安装example.exe,和ngen将安装本机图像的assebmlIEs
但是这是问题:
如果我尝试高架CMD并运行
C:windowsMicrosoft.NETFramework64v4.0.30319ngen display example.exe
将显示example.exe文件名和本机映像的版本,但是,使用以下在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(); }
但是stdoutxstring不包含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:ProjectExamplebinDeBUGExample.EXE NGEN Roots that depend on "Example": C:ProjectExamplebinDeBUGExample.EXE Native Images: Klik.windows.Forms.Entrylib.V2.2008,Version=2.0.0.0,PublicKeyToken=null Microsoft.CSharp,Version=4.0.0.0,PublicKeyToken=b03f5f7f11d50a3a Microsoft.CSharp,PublicKeyToken=b03f5f7f11d50a3a ncalc,Version=1.3.8.0,PublicKeyToken=973cde3f1cafed03 Newtonsoft.Json,Version=6.0.0.0,PublicKeyToken=30ad4fe6b2a6aeed Newtonsoft.Json,PublicKeyToken=30ad4fe6b2a6aeed RedGate.Migrations.Core,Version=1.0.0.1401,PublicKeyToken=7f465a1c156d4d57 <deBUG> RedGate.Shared.ComparisonInterfaces,Version=1.0.2.278,PublicKeyToken=7f465a1c156d4d57 RedGate.Shared.sql,Version=9.9.0.0,PublicKeyToken=7f465a1c156d4d57 RedGate.Shared.Utils,PublicKeyToken=7f465a1c156d4d57 RedGate.soCCompareInterface,Version=3.0.50.59,PublicKeyToken=7f465a1c156d4d57 RedGate.sqlCompare.ASTParser,Version=11.0.0.414,PublicKeyToken=7f465a1c156d4d57 RedGate.sqlCompare.Engine,Version=11.1.0.2,PublicKeyToken=7f465a1c156d4d57 <deBUG> RedGate.sqlCompare.Rewriter,PublicKeyToken=7f465a1c156d4d57 System.Configuration.Install,PublicKeyToken=b03f5f7f11d50a3a System.Data.DataSetExtensions,PublicKeyToken=b77a5c561934e089 System.Data,PublicKeyToken=b77a5c561934e089 System.Data.linq,PublicKeyToken=b77a5c561934e089 System.Data.sqlite,Version=1.0.85.0,PublicKeyToken=db937bc2d44ff139 System.Deployment,PublicKeyToken=b03f5f7f11d50a3a System,PublicKeyToken=b77a5c561934e089 System.Drawing,PublicKeyToken=b03f5f7f11d50a3a System.Management,PublicKeyToken=b03f5f7f11d50a3a System.Runtime.Serialization,PublicKeyToken=b77a5c561934e089 System.ServiceModel,PublicKeyToken=b77a5c561934e089 System.Threading,Version=1.0.2856.102,PublicKeyToken=31bf3856ad364e35 System.Web,PublicKeyToken=b03f5f7f11d50a3a System.Web,PublicKeyToken=b03f5f7f11d50a3a System.windows.Forms,PublicKeyToken=b77a5c561934e089 System.Xml,PublicKeyToken=b77a5c561934e089 System.Xml.linq,PublicKeyToken=b77a5c561934e089 Telerik.Reporting,Version=9.0.15.324,PublicKeyToken=a9d7983dfcc261be Telerik.ReportVIEwer.WinForms,PublicKeyToken=a9d7983dfcc261be Telerik.WinControls.ChartVIEw,Version=2015.1.331.40,PublicKeyToken=5bb2a467cbec794e Telerik.WinControls,PublicKeyToken=5bb2a467cbec794e Telerik.WinControls.GrIDVIEw,PublicKeyToken=5bb2a467cbec794e Telerik.WinControls.themes.Office2010Black,PublicKeyToken=5bb2a467cbec794e Telerik.WinControls.themes.Office2010Silver,PublicKeyToken=5bb2a467cbec794e
什么USB设备(友好名称)当前连接到PC?
发送消息到windows进程(而不是它的主窗口)
如何在.net或其他技术中呈现应用程序
如何为windows编写一个非常简单的本机应用程序(不需要.NET并通过安装过程)
API来创build一个新的调制解调器
跨进程事件 – 可靠地释放所有服务员
什么编程实践影响窗口句柄的数量?
C#在运行时或更早时间设置stream程描述
通过本地networking的URL调用子程序?
C#/。NET定时器和Win32睡眠function都是不精确的
是的,你没有正确地做到这一点。 您正在使用的命令的语法是:
ngen.exe display [assemblyname | assemblyPath]
请注意assemblyname和assemblyPath之间的区别。 当你从cmd.exe运行它时,你键入“example”。 因此指定了(部分)程序集名称。 在你的代码中,你使用了“example.exe”。 Environment.CurrentDirectory是正确设置的,是一个常见的意外。 所以Ngen.exe可以找到这个文件 ,它变得很健谈。 不仅列出程序集名称,还列出所有依赖项的本地映像。 像Klik.windows.Forms.Entrylib等等。
不是唯一的问题,请注意您指定了部分程序集名称。 你要确保你的程序集的特定版本是正版的。 使代码看起来像这样:
process.StartInfo.Arguments = "display "" + System.Reflection.Assembly.GetEntryAssembly().Fullname + """;
并用Project> PropertIEs> DeBUG选项卡>测试它,取消“启用Visual Studio宿主进程”复选框。
次要的烦恼是本地图像(x86与x64)的差距,让您的应用程序升高,以便您可以安装原生图像,通常只有在您的应用程序安装完成时才会出现。
总结以上是内存溢出为你收集整理的NGEN显示返回在C#winforms中使用Process.Start()运行时,与高位CMD不同的结果全部内容,希望文章能够帮你解决NGEN显示返回在C#winforms中使用Process.Start()运行时,与高位CMD不同的结果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)