我能知道我的应用程序是否在Windows RT上运行并带有C#吗?

我能知道我的应用程序是否在Windows RT上运行并带有C#吗?,c#,windows-8,windows-store-apps,winrt-xaml,C#,Windows 8,Windows Store Apps,Winrt Xaml,我知道无法在Windows应用商店应用程序中获取操作系统版本,请让我解释更多 我的应用程序是一个用C#编程的Windows应用商店应用程序。我的应用程序的某些功能依赖于另一个桌面应用程序(可能这不是一个好的设计)。正如我所知,第三方桌面应用程序无法安装在Windows RT上,因此我只想知道我的应用程序是否在Windows RT上运行,并禁止在Windows RT上使用我的应用程序的某些功能。我不想使用GetNativeSystemInfo(),因为它是win32 API,如果我使用该API,我

我知道无法在Windows应用商店应用程序中获取操作系统版本,请让我解释更多


我的应用程序是一个用C#编程的Windows应用商店应用程序。我的应用程序的某些功能依赖于另一个桌面应用程序(可能这不是一个好的设计)。正如我所知,第三方桌面应用程序无法安装在Windows RT上,因此我只想知道我的应用程序是否在Windows RT上运行,并禁止在Windows RT上使用我的应用程序的某些功能。我不想使用GetNativeSystemInfo(),因为它是win32 API,如果我使用该API,我的应用程序无法与任何cpu兼容

我不知道这是否真的可能,但您可以使用“条件编译符号”来实现结果。例如,您可以仅为ARM构建添加
ARM
,并构建3个独立的包:ARM、x86和x64。 你可以找到很多关于如何使用它的文章。这是其中一个Visual Studio:

因此,您只需为您的项目设置ARM配置特殊符号
ARM
(就像在这个屏幕截图中看到的
LIVE


在此之后,您可以使用C#指令:隐藏ARM构建的部分代码。

由于应用程序的某些功能依赖于桌面应用程序(可能已安装或未安装),因此即使在x86版本的应用程序中,您也需要处理“未安装”状态

我要做的是根据默认设置禁用所有这些功能,并在每次启动时检查桌面应用程序是否存在。只有当它存在时,我才会启用附加功能。

是的。这就是为什么

Task<ProcessorArchitecture> WhatProcessor()
{
    var t = new TaskCompletionSource<ProcessorArchitecture>();
    var w = new WebView();
    w.AllowedScriptNotifyUris = WebView.AnyScriptNotifyUri;
    w.NavigateToString("<html />");
    NotifyEventHandler h = null;
    h = (s, e) =>
    {
        // http://blogs.msdn.com/b/ie/archive/2012/07/12/ie10-user-agent-string-update.aspx
        // IE10 on Windows RT: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0;)
        // 32-bit IE10 on 64-bit Windows: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
        // 64-bit IE10 on 64-bit Windows: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)
        // 32-bit IE10 on 32-bit Windows: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0) 
        try
        {
            if (e.Value.Contains("ARM;"))
                t.SetResult(Windows.System.ProcessorArchitecture.Arm);
            else if (e.Value.Contains("WOW64;") || e.Value.Contains("Win64;") || e.Value.Contains("x64;"))
                t.SetResult(Windows.System.ProcessorArchitecture.X64);
            else
                t.SetResult(Windows.System.ProcessorArchitecture.X86);
        }
        catch (Exception ex) { t.SetException(ex); }
        finally { /* release */ w.ScriptNotify -= h; }
    };
    w.ScriptNotify += h;
    w.InvokeScript("execScript", new[] { "window.external.notify(navigator.userAgent); " });
    return t.Task;
}
Task WhatProcessor()
{
var t=new TaskCompletionSource();
var w=新的WebView();
w、 AllowedScriptNotifyUri=WebView.AnyScriptNotifyUri;
w、 导航字符串(“”);
NotifyEventHandler h=null;
h=(s,e)=>
{
// http://blogs.msdn.com/b/ie/archive/2012/07/12/ie10-user-agent-string-update.aspx
//Windows RT上的IE10:Mozilla/5.0(兼容;MSIE 10.0;Windows NT 6.2;ARM;Trident/6.0;)
//64位Windows上的32位IE10:Mozilla/5.0(兼容;MSIE 10.0;Windows NT 6.2;WOW64;Trident/6.0)
//64位Windows上的64位IE10:Mozilla/5.0(兼容;MSIE 10.0;Windows NT 6.2;Win64;x64;Trident/6.0)
//32位Windows上的32位IE10:Mozilla/5.0(兼容;MSIE 10.0;Windows NT 6.2;Trident/6.0)
尝试
{
如果(例如,值包含(“ARM;”)
t、 SetResult(Windows.System.ProcessorArchitecture.Arm);
else if(e.Value.Contains(“WOW64;”)e.Value.Contains(“Win64;”)e.Value.Contains(“x64;”)e.Value.Contains)
t、 SetResult(Windows.System.ProcessorArchitecture.X64);
其他的
t、 SetResult(Windows.System.ProcessorArchitecture.X86);
}
catch(Exception ex){t.SetException(ex);}
最后{/*release*/w.ScriptNotify-=h;}
};
w、 ScriptNotify+=h;
w、 InvokeScript(“execScript”,new[]{”window.external.notify(navigator.userAgent);“});
返回t.任务;
}

祝你好运

嗨,outcoldman,谢谢你的回复。这确实是一个解决方案,我想把它作为我最后的选择。但我真的很想找到一种方法来解决这个问题,只需一个软件包。不,W8应用程序不是桌面或地铁。他们只有一个,麦德龙。虽然我们不再称之为地铁,但在这种情况下,这是最清晰的方式。OP提到了“桌面应用程序”和“Windows应用商店应用程序”。2.“Windows应用商店应用程序”依赖于“桌面应用程序”。3.“桌面应用”可能运行或不运行;可能存在也可能不存在。这和“Windows应用商店应用程序”的处理器架构无关。嗨,杰瑞,代码很好。我考虑过webview,但不如你的好。我会试试的,非常感谢。太好了,我在我的表面RT上测试了它;它起作用了。当然可以。对于使用IE11的Windows 8.1,您应该使用
eval
而不是
execScript