【问题标题】:Run c# console application using shellExecute [closed]使用 shellExecute 运行 c# 控制台应用程序 [关闭]
【发布时间】:2013-01-14 22:31:32
【问题描述】:

我有 c# 控制台应用程序(Net framework 4.5,visual studio 2010 express)。我可以使用 cmd 运行这个应用程序,它的工作正常。但是出于一些非常重要的原因,我需要从其他使用 c++ 编写的应用程序运行此应用程序。我曾尝试使用 ShellExecute、CreateProcess、WinExec 运行 c# 应用程序。它总是崩溃,并且不会在我之前使用 cmd 启动它的同一台机器上运行。是否还有任何方法可以启动这个 c# 应用程序。或者我需要用一些特殊的方式编译/组装这个 c# 应用程序吗? 更新 示例:

方法一

SHELLEXECUTEINFO ShExecInfo = {0};  
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);   
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;  
ShExecInfo.hwnd = NULL;  
ShExecInfo.lpVerb = NULL;  
ShExecInfo.lpFile = "C:\\PATH\\To\\THE\\APP.exe";  
ShExecInfo.lpParameters = szParameters;  
ShExecInfo.lpDirectory = NULL;  
ShExecInfoFlash.hInstApp = NULL;  
ShellExecuteEx(&ShExecInfoFlash);  
WaitForSingleObject(ShExecInfoFlash.hProcess,INFINITE); 

方法二

PROCESS_INFORMATION pi; 
char bff[512]; 
memset(&si,0,sizeof(si)); 
si.cb=sizeof(si); 
if(!CreateProcess(NULL,szParameters,NULL,NULL,0,0,NULL,NULL,&si,&pi)) 
{ return TS_METHOD_ABORTED;} 
WaitForSingleObject(pi.hProcess,INFINITE); 
CloseHandle(pi.hProcess); 
CloseHandle(pi.hThread);

而且它总是以同样的方式崩溃。它告诉我发生了意外并建议我向MS发送报告。

【问题讨论】:

  • 您究竟是如何尝试从 C++ 执行程序的?
  • C# 程序从不羞于抛出异常。您不应该害羞地利用这一点并实际显示异常。这需要您为 AppDomain.CurrentDomain.UnhandledException 事件编写事件处理程序。记录或显示 e.ExceptionObject.ToString() 值。您会看到异常消息以及堆栈跟踪中出现问题的方式。
  • @HansPassant 我没有从 c# 应用程序中得到异常。当我尝试运行 c++ 程序时出现异常。这是标准的 Windows 异常“哎呀,出了点问题,你想向 MS 发送报告吗”。当我尝试以相同的方式运行其他一些控制台 .exe 应用程序(来自其他供应商)时,c++ 应用程序只会运行其他应用程序,没有任何异常。
  • 呃,您启动程序的代码是 C++ 代码。我放弃了。
  • 如果您手动双击或自己运行 C# 可执行文件会发生什么。它是否按您的预期运行?此外,C# 可执行文件是否具有运行所需的任何特殊权限,这意味着它是否需要作为特定用户调用,或者有任何深奥的安全要求?您尝试在哪个操作系统上调用 C# 应用程序,最后,您是否在尝试调用应用程序的机器上安装了正确的目标 .Net 框架?

标签: c# c++ .net visual-studio-2010 console-application


【解决方案1】:

我已经很久没有在 c++ 中尝试过你想要做的事情了,但是我最近在 c# 中做到了。我知道这是一半的答案,所以提前抱歉。 c++ 中的 ShellExecute(或任何其他方法)是否使您能够设置正在启动的程序的工作目录?我发现有时候不设置这个,启动的程序会认为自己在系统文件夹中运行,结果可能是因为相对路径错误导致无法加载资源。

希望对你有帮助。

编辑:

看来ShellExecute 确实有你要找的东西。

现在已经发布了一个示例,来自上面:

SHELLEXECUTEINFO ShExecInfo = {0};  
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);   
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;  
ShExecInfo.hwnd = NULL;  
ShExecInfo.lpVerb = NULL;  
ShExecInfo.lpFile = "C:\\PATH\\To\\THE\\APP.exe";  
ShExecInfo.lpParameters = szParameters;  
ShExecInfo.lpDirectory = NULL;  
ShExecInfoFlash.hInstApp = NULL;  
ShellExecuteEx(&ShExecInfoFlash);  
WaitForSingleObject(ShExecInfoFlash.hProcess,INFINITE); 

首先,我建议尝试启动另一个您知道应该可以运行的程序,例如 notepad.exe。

接下来,就像我之前说的,设置工作目录以匹配 exe。

ShExecInfo.lpFile = "C:\\PATH\\To\\THE\\APP.exe";  
ShExecInfo.lpParameters = szParameters;  
ShExecInfo.lpDirectory = "C:\\PATH\\To\\THE";  

【讨论】:

  • 如果其他应用程序崩溃,那么 C++ 应用程序可能找到了 C# 可执行文件。
  • 它可能已经找到了 c# exe,但是 c# 应用程序的工作目录可能设置为 c++ 应用程序之一,甚至是系统目录
  • 是的,你说得对!我几乎爱你。
猜你喜欢
  • 1970-01-01
  • 2018-07-13
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多