在 C# winforms 中使用 Process.Start() 运行 时,NGEN 显示 Returns 与 Elevated CMD 不同的结果

NGEN Display Returns A different result than Elevated CMD when run using Process.Start() in C# winforms

一段时间以来,我一直在努力与我的同事一起解决这个问题。
我使用 Ngen 来制作原生图像并提高我的应用程序在客户端上的性能。
让我们假设 Exe 文件名是 Example.exe
我尝试在应用程序中做的是我安装 ngen example.exe,ngen 将为 assebmlies 安装本机图像
然而问题是:
如果我尝试使用高架 CMD 和 运行
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen Display example.exe
显示 example.exe 文件名和本机图像的版本,但是,使用以下代码在 windows 形式 c# 中做同样的事情,它不显示文件名和版本 example.exe 文件,并显示依赖项,如 Telerik 等。
所以我的问题是为什么 CMD return 是正确的结果,而进程 return 是依赖项而不是文件名和版本本身?
这是我的一些代码:

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 returns 的正确结果:

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]

注意 assemblyNameassemblyPath 之间的区别。当你从 cmd.exe 中 运行 时,你输入了 "example"。从而指定了(部分)程序集名称。在您的代码中,您使用了 "example.exe"。 Environment.CurrentDirectory 是偶然正确设置的,这是一个常见的事故。所以 Ngen.exe 可以找到 文件 并且它变得很健谈。不仅列出程序集名称,还列出其所有依赖项的本机图像。比如Klik.Windows.Forms.EntryLib等等。

不是唯一的问题,请注意您指定了 partial 程序集名称。您要确保程序集的 specific 版本是 ngen-ed。让代码看起来像这样:

    process.StartInfo.Arguments = "display \"" + 
        System.Reflection.Assembly.GetEntryAssembly().FullName + "\"";

然后使用“项目”>“属性”>“调试”选项卡对其进行测试 > 取消勾选 "Enable the Visual Studio hosting process" 复选框。

次要担心的是本机图像的位数(x86 与 x64)和提升您的应用程序以便您可以安装本机图像,这通常只有在安装应用程序时才会有机会。