gpt4 book ai didi

c# - 在 C# winforms 中使用 Process.Start() 运行时,NGEN Display 返回与 Elevated CMD 不同的结果

转载 作者:可可西里 更新时间:2023-11-01 11:49:29 26 4
gpt4 key购买 nike

一段时间以来,我一直在努力与我的同事一起解决这个问题。
我使用 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]

注意assemblyNameassemblyPath 之间的区别。当您从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com