Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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# 如何使用Cortana技能打开本地应用程序_C#_Botframework_Cortana_Processstartinfo - Fatal编程技术网

C# 如何使用Cortana技能打开本地应用程序

C# 如何使用Cortana技能打开本地应用程序,c#,botframework,cortana,processstartinfo,C#,Botframework,Cortana,Processstartinfo,从今天早上开始我就一直在尝试这样做,但它似乎对我不起作用 要求用户调用cortana,让她打开一个应用程序——我们称之为app1 我基于EchoBot创建了一个azure机器人,并用以下代码替换了应答代码: 受保护的覆盖异步任务 OnMessageActivitySync(iTunesContext-turnContext, 取消令牌(取消令牌) { Wait turnContext.SendActivityAsync(MessageFactory.Text($)Echo: 正在打开app1…)

从今天早上开始我就一直在尝试这样做,但它似乎对我不起作用

要求用户调用cortana,让她打开一个应用程序——我们称之为app1

我基于EchoBot创建了一个azure机器人,并用以下代码替换了应答代码:

受保护的覆盖异步任务
OnMessageActivitySync(iTunesContext-turnContext,
取消令牌(取消令牌)
{
Wait turnContext.SendActivityAsync(MessageFactory.Text($)Echo:
正在打开app1…),取消令牌);
var startInfo=新流程startInfo
{
FileName=@“D:\\u Projects\xyz\app1.exe”,
UseShellExecute=false,
CreateNoWindow=false,
};
var进程=进程启动(startInfo);
var success=process!=null&&process.WaitForExit(30*10000);
如果(!成功)
{
//进程?.Kill();
抛出新的ApplicationException(“在
方法执行。服务接口未在中完成
及时的时尚。”);
}
var exitCode=process.exitCode;
}
从Azure下载代码后在本地执行时,此不起作用。 但当从Cortana调用时,它不起作用

编辑:使用Bot Framework Emulator(v4)完成本地测试

它只需打印开始的App1行并放在那里。 调试窗口如预期的那样-无用

现在我尝试使用一种完全不同的技术,我在某个地方读到过,它包括在本地将应用程序添加到user\programs\folder,并通过说openapp1从Cortana调用它

问题是,Cortana根本无法识别该应用程序。它只是启动Edge并在bing上搜索app1

我看过一些关于cortana技能的视频,其中一些视频使用uwp应用程序启动了一个新的应用程序,但我的视频实际上是使用auto-py to-exe从python生成的exe,所以这对我没有用处

参考资料:


这个问题有解决方案吗?

之所以在本地工作而在部署时不工作,是因为您的代码在运行代码的任何机器(服务器端)上执行
进程。Start()
,而不是在与您的代码交互的人的机器(客户端)上执行。本地测试时,服务器和客户端是同一台机器;部署时并非如此

在有限的基础上,实现你想要的是可能的

阅读文档

目前,科尔塔纳。因此,要启动应用程序,应用程序必须具有与之关联的uri协议

例如,要启动使用
bingmaps:
协议的Windows地图应用程序,您可以使用(注意:我的示例使用Bot框架V4代码,而我链接的文档使用V3):

var message=MessageFactory.Text(“启动应用程序…”);
message.ChannelData=JObject.FromObject(新{
action=new{type=“LaunchUri”,uri=“bingmaps:?where=Paris”}
});
wait context.SendActivityAsync(消息);
如果您需要访问非UWP应用程序,则必须在注册表中的本地计算机上:


只是好奇:真的有什么严重的针对Windows10的开发,特别是Cortana。。。?据我看,,统计数据甚至没有显示MSFT最近对Cortana所做的任何改进。我们通常使用AWS和Alexa-但是由于机器运行Windows 10,并且安装了Cortana,并且应用程序是本地的,所以不需要通过Cortana->Alexa->LocalApp直接执行Cortana->LocalApp并不困难。@Aousafrashid Cortana是本地的仍然在使用,但大多数更新都是围绕技能进行的,尤其是我所期望的新的,因为那些启动的UWP应用程序正在使用launchURI命令,实际上process.start将在服务器端触发(尽管我希望它在cortana端触发)你知道有没有一种方法可以在没有机器人的情况下使用标准的exe来实现这一点?如果没有机器人,你可以让Cortana“启动Microsoft Word”。此外,我还尝试使用了一些不同的文件URI方案变体(
file://
),但没有一个有效。不过,你至少可以让它在本地运行。谢谢mdrichardson,我也在计划类似的事情-你的回答推动我朝这个方向前进。我的计划是让机器人打开一个UWP应用程序,因为这似乎是可行的,UWP应用程序将从其中调用exe。实际上,我使用UWP应用程序中介打开应用程序,然后依次打开Python exe。完全废弃Azure机器人,因为即使在测试时它们也极其昂贵。
protected override async Task
OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext,
CancellationToken cancellationToken)
    {
        await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: 
                                Opening app1..."), cancellationToken);

        var startInfo = new ProcessStartInfo
        {
            FileName = @"D:\_Projects\xyz\app1.exe",
            UseShellExecute = false,
            CreateNoWindow = false,
        };

        var process = Process.Start(startInfo);
        var success = process != null && process.WaitForExit(30 * 10000);

        if (!success)
        {
            //process?.Kill();
            throw new ApplicationException("A timeout occurred during 
                 method execution. The service interface did not finish in a
                        timely fashion.");
        }
        var exitCode = process.ExitCode;
    }
  your-protocol-name/
    (Default)    "URL:your-protocol-name Protocol"
    URL Protocol ""
    shell/
      open/
        command/
          (Default) PathToExecutable