在windows8应用商店应用中调用exe

 public async void CreateTextCommand(string file_to_run)
        {
               StorageFolder localFolder =
               Windows.Storage.ApplicationData.Current.LocalFolder;
               var file = await localFolder.CreateFileAsync("proxyfile.txt", CreationCollisionOption.ReplaceExisting);

               bb.Text = "Kinect已打开";
               string command = string.Format("run={0},{1}", file_to_run, DateTime.Now.Ticks);

               await FileIO.WriteTextAsync(file, command);
        }

              这个问题按照surface系统的架构是不可能直接实现的。因为我们熟知的Process类在应用商店应用中不存在,我们的电脑大多是在用X86架构(处理器),而windows RT是ARM架构的处理器,这就是process类被删去的原因。

       因此,想要实现在Windows store App中调用exe文件,以前的方法行不通。

       我的思路是曲线救国。

       第一步,在sln中建立一个名为ProxyWpf的代理应用。这个应用与原本的应用完全分离,只负责调用exe。因为是wpf项目,所以可以使用prcess.start()调用exe文件。

                                                          

       如图所示,上面的项目就是windows8 app,而底下的是代理proxyWpf。

       我们在Windows8 app中创建一个文本文件 ,并写入想要运行的exe。使用DateTime.Now.Ticks获取触发时的时间,并写入txt文件。每次点击触发,会得到不同的时间值。txt文件的内容如下:


                                                           

       proxyWpf是一个监视器,发现这个txt文件变化后就会执行exe文件。在这里,监视的功能由FileSystemWatcher实现。

static void ProcessCommand()
        {
            // pause for 100 millisecond for Windows to properly write the contents of the
            // proxyfile.txt
            System.Threading.Thread.Sleep(100);

            string file_to_run = string.Empty;
            string UID = string.Empty;

            string filename = System.IO.Path.Combine(@"localPath", "proxyfile.txt");

            if (!File.Exists(filename))
            {
                MessageBox.Show("proxyfile.txt is missing!");
            }

            using (StreamReader reader = new StreamReader(filename))
            {
                string data = reader.ReadToEnd();
                string[] cmd2 = data.Split('=')[1].Split(',');

                file_to_run = cmd2[0];
                UID = cmd2[1];
            }

            if (!running_apps.Contains(file_to_run + UID))
            {
                RunOnce(file_to_run, UID);
            }
            else
            {
                Debug.WriteLine(file_to_run + " is already running");
            }
            
        }
             以上代码的作用是读取txt文件的内容,获得运行的命林。

 static void RunOnce(string fullpath, string UID)
        {
            ProcessStartInfo psi = new ProcessStartInfo()
            {
                FileName = fullpath,
                UseShellExecute = true
            };
                Process.Start(psi);
                running_apps.Add(fullpath + UID);
         } 
            为了防止多次调用,需要进行判断。

           综上,一旦监测到proxyfile.txt发生变化,

          watcher.Changed += new FileSystemEventHandler(OnChanged);
           Onchanged事件被触发,启动.exe文件。

           Tips:

                  1、可在解决方案资源管理器的属性中将两个项目均设为启动项,如下图所示:

                       

                    2、Windows8 app中的文件路径非常奇怪,建议使用Windows.Storage.ApplicationData.Current.LocalFolder这个目录,否则会出现权限错误。

                    3、此类实验危险性较高,尝试的时候随时保存重要文件,我在刚开始尝试的时候半个小时重启三次,因为毕竟是多个进程,且涉及调用,处理不好会导致打开好多个文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值