Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 启动一次单击应用程序-找不到文件_C#_Clickonce - Fatal编程技术网

C# 启动一次单击应用程序-找不到文件

C# 启动一次单击应用程序-找不到文件,c#,clickonce,C#,Clickonce,我有一个基本服务,将用于每x分钟运行一次ClickOnce应用程序,但当我运行Process.Start时,我收到一个文件找不到的异常 代码 我收到的错误是: %AppData%\Microsoft\Windows\Start Menu\Programs\PubName\ProdName.appref-ms System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified

我有一个基本服务,将用于每x分钟运行一次ClickOnce应用程序,但当我运行Process.Start时,我收到一个文件找不到的异常

代码

我收到的错误是:

%AppData%\Microsoft\Windows\Start Menu\Programs\PubName\ProdName.appref-ms
System.ComponentModel.Win32Exception (0x80004005): The system cannot find the file specified
   at System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start(String fileName)
如果我运行在资源管理器中检索到的ProcessName,那么应用程序将成功启动。ProcessName的值为:

C:\Users\xxx\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\PubName\ProdName.appref-ms


启动文件时是否缺少某些内容?

Windows服务是在用户登录其帐户之前就可以运行的程序。这是Windows服务的用途,根据此定义,您无法访问特定的用户环境变量,如%AppData%,因为您不在用户会话中,因此如果将地址写入.txt,您将看到结果

根据您的定义,Windows服务将按LocalSystem、LocalService或NetworkService运行。转到TaskManager->Services->Open Services并查看登录为列

因此,您必须使用可通过服务访问的通用路径

最可怕的解决方案是强迫您的服务等待用户登录并模拟他的令牌

我宁愿选择一个更好的地方

有一种方法可以在VisualStudio的UserSession中调试并查看您的服务错误。 将Program.cs更改为类似以下内容:

static void Main()
{
#if DEBUG
        var MainService = new MainService();
        MainService.OnDebug();

#else

        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new MainService()
        };
        ServiceBase.Run(ServicesToRun);
#endif
}
并将OnDebug功能添加到您的服务中:

 public void OnDebug()
 {
    OnStart(null);
 }

如果您以这种方式调试您的项目,您将看到您的服务正在按预期工作

您的项目是Windows服务吗?是的,上面代码所在的项目是Windows服务。我通过获取登录用户并构建应用程序数据路径,以便服务可以访问,从而使该项目运行该过程,但应用程序未打开。进程正在任务管理器中运行,但应用程序未显示。Windows服务在其他会话上运行。如果您的应用程序是Windows窗体或其他可视应用程序;你在桌面上看不到它。实际上,桌面是会话的一部分,因此,当您在Windows服务下调用进程时,它将作为系统会话执行。如果您确定为流程设置的新路径;请选中“任务管理器流程”选项卡并选中“显示所有用户的流程”,以查看所有正在运行的流程。
 public void OnDebug()
 {
    OnStart(null);
 }