使用 .Net Standard,是否有一种跨平台的方式来获取进程的父进程 ID?
几个 SO 问题和答案解决了如何以特定于Windows 的方式执行此操作(例如,如何以托管方式在 .NET 中获取父进程),通常使用 WMI 的 Win32_Process、PInvoke 或 PerformanceCounters。但是,这些都不适用于 .Net Standard 的跨平台世界。
目前似乎没有办法做到这一点。我创建了几个 GitHub 问题,建议将相关功能添加到 .Net Standard。
我们有一个winforms LOB应用程序,在正常情况下应该从应该进行基本版本检查并下载任何更新的组件的启动器启动,然后生成主进程.
我们看到的一个问题是,一些工作人员通过不运行更新应用程序发现它加载速度更快,但是这可能导致人们没有最新的功能并导致各种头痛的支持.
我希望能够做的是,如果他们没有通过初始化应用程序,则会发出警告.理想情况下,我希望能够在不必更改更新应用程序的情况下执行此操作(因为这意味着在每个客户端上安装新的MSI),而出现的方法是找到一些方法来查找有关开始"我"并检查白/黑名单的过程,我永远无法找到办法做到这一点?
旁白:当然,如果我确实使用更改更新应用程序,我可能会将其更改为将预共享密钥作为命令行参数传递,或者更好的是,更改应用程序以便我可以将其加载为一个类库,通过反射实例化相关的类.ClickOnce已被排除,因为它不支持为多个用户安装
我想知道是否有一种编程方式在运行时确定应用程序是通过调试器启动还是启动已安装的应用程序版本.我的应用程序目前正通过ClickOnce部署.
当应用程序在调试模式与生产模式下运行时,我想要更改某些设置.
我知道构建配置解决方案 - 我很好奇是否有一种编程方式来确定这些信息
谢谢
我正在使用一些代码在本机进程内启动CLR运行时,然后调用我的.NET DLL在该进程中加载另一个.NET可执行文件.
要加载其他.NET可执行文件我正在使用反射,如下所示:
Assembly.Load(file).EntryPoint.Invoke(null, null);
Run Code Online (Sandbox Code Playgroud)
现在,我注入一个启动运行时的C++ dll,然后调用.NET dll,它使用Assembly.Load将另一个.NET可执行文件加载到内存中并执行它.
一旦dll加载我的.NET可执行文件,调用:
System.Reflection.Assembly.GetExecutingAssembly().Location;
Run Code Online (Sandbox Code Playgroud)
甚至
Process.GetCurrentProcess().MainModule.FileName;
Run Code Online (Sandbox Code Playgroud)
当然,这会返回可执行文件本身的位置,即使它在另一个主机进程中运行.有什么方法可以获取该主机进程的名称吗?进程资源管理器将其显示为在主机进程内运行,因此我知道我已正确运行该部分.
当然,如果我在首先加载的.NET DLL中运行这些命令,那么它将显示正确的进程名称.
谢谢.
编辑:
我曾尝试GetEntryAssembly()和GetCallingAssembly()为好.
如果我Program.exe从现有的命令行窗口运行,那么当它完成并退出时,控制台输出仍然存在并且可见。
如果我双击 my Program.exe,那么它将打开一个新的命令行窗口,用于控制台输出...但是当我的 exe 完成时,该窗口将关闭,并带走输出。
在后一种情况下,为了防止输出日志丢失,我可能想要我的Main()be的最后两行Console.WriteLine("Press any key to exit"); Console.ReadKey();
但如果我在前一种情况下这样做,那就有点烦人了。
有什么方法可以检测这两种情况之间的差异,以便我可以有条件地“等待用户说我可以关闭”......仅在必要时?
我有一个AutoUpdater应用程序,可以启动另一个应用程序.无论如何强制第二个应用程序只有在AutoUpdater启动时才能运行?
问题是,一些最终用户将在其桌面上创建主应用程序文件的快捷方式.这成为一个问题,因为它应该在启动之前检查应用程序的更新,并且它们不会收到我们的更新.
我有一个想法是通过WCF创建一个IPC通道,并从AutoUpdater向另一个应用程序发出一个非常简单的命令.如果其他应用程序在2或3秒内没有收到该命令,它将自行关闭.
这似乎比应该需要的代码/开销更多.有没有更简单的方法?
谢谢!
我有一个既是 gui 又是控制台的应用程序。
控制台:它从 Windows 计划执行以执行一些自动化任务,因此它使用参数调用
GUI:用于输入配置参数,这是用户执行此操作的一种比控制台更好的方式。
所有这些都很好用。它主要是一个控制台应用程序,如果控制台不带参数打开并且显示配置表单,则该控制台是隐藏的。
问题: 如果我从没有参数的控制台打开它,控制台将被隐藏并显示表单。我如何检测我从什么或从哪里打开应用程序,如果它是从 Windows 中打开的,则隐藏控制台,如果它是从控制台打开的,则显示控制台。
嘿,我正在为我的智能手机开发一个小应用程序,使用 Windows Mobile 6。我试图获取所有当前正在运行的 processec,但方法 CreateToolhelp32Snapshot 总是返回 -1。所以现在我卡住了。我试图在调用 GetLastError() 方法时出错,但该方法返回 0 值。这是我的代码片段。
private const int TH32CS_SNAPPROCESS = 0x00000002;
[DllImport("toolhelp.dll")]
public static extern IntPtr CreateToolhelp32Snapshot(uint flags,
uint processid);
public static Process[] GetProcesses()
{
ArrayList procList = new ArrayList();
IntPtr handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ((int)handle > 0)
{
try
{
PROCESSENTRY32 peCurr;
PROCESSENTRY32 pe32 = new PROCESSENTRY32();
// get byte array to pass to API call
byte[] peBytes = pe32.ToByteArray();
// get the first process
int retval = Process32First(handle, peBytes);
Run Code Online (Sandbox Code Playgroud) 我正在使用C#应用程序来启动java Web应用程序.我希望我的C#应用程序知道用户什么时候关闭java应用程序.我正在使用此代码:
var javaws = File.Exists(@"C:\Program Files\Java\jre6\bin\javaws.exe") ? @"C:\Program Files\Java\jre6\bin\javaws.exe" : @"C:\Program Files (x86)\Java\jre6\bin\javaws.exe";
var psi = new ProcessStartInfo(javaws, String.Format("http://{0}:/appstart.jnlp", hostAddress));
Process.Start(psi).WaitForExit();
Run Code Online (Sandbox Code Playgroud)
这段代码成功启动了java程序,然后WaitForExit()被调用并立即返回.我相信这是因为"javaws"只是启动另一个名为"javaw"的进程,然后"javaws"关闭.有没有办法A)等待所有子进程也完成,或者B)等待特定的子进程?
-
我发现了这个相关的帖子:javaws退出代码真的坏了吗?虽然答案表明1.6.0_23修复了它,但我在Java 1.6.0_23的开发机器上看到完全相同的行为.我现在正在寻找的是一种解决方法,使上述代码按预期工作.我需要启动这个jnlp文件,等待它的执行完成,然后在C#程序中做一些额外的代码.Java应用程序不受我的控制,所以我无法在那里添加功能.
-
对于任何想知道的人,最终解决方案看起来像这样:
var javaws = File.Exists(@"C:\Program Files\Java\jre6\bin\javaws.exe") ? @"C:\Program Files\Java\jre6\bin\javaws.exe" : @"C:\Program Files (x86)\Java\jre6\bin\javaws.exe";
var psi = new ProcessStartInfo(javaws, String.Format("http://{0}:/appstart.jnlp", hostAddress));
Process.Start(psi).WaitForExit();
var javaw = Process.GetProcessesByName("javaw");
javaw.Single(ja => ja.StartTime.Equals(javaw.Max(j => j.StartTime))).WaitForExit();
Run Code Online (Sandbox Code Playgroud)
如果javaw在计算机上运行其他Java Web应用程序,则仅提供等待最近启动的进程的额外好处.