C# 如何从share charm通过协议激活来激活应用程序

C# 如何从share charm通过协议激活来激活应用程序,c#,xaml,windows-8,windows-store-apps,C#,Xaml,Windows 8,Windows Store Apps,我正在尝试从自己的共享合同激活我的应用程序(请-从认证的角度来看,不要评论这是否可以……应用程序激活是通过共享合同UI上的按钮完成的,除非用户主动激活,否则不会发生。我在这里问的是技术问题,而不是用户体验方面的问题-谢谢!!) 我的设置方式如下: this.m_shareOperation.ReportStarted(); // .... this.m_shareOperation.ReportCompleted(); await Launcher.LaunchUriAsync(new U

我正在尝试从自己的共享合同激活我的应用程序(请-从认证的角度来看,不要评论这是否可以……应用程序激活是通过共享合同UI上的按钮完成的,除非用户主动激活,否则不会发生。我在这里问的是技术问题,而不是用户体验方面的问题-谢谢!!)

我的设置方式如下:

this.m_shareOperation.ReportStarted();

// ....

this.m_shareOperation.ReportCompleted();

await Launcher.LaunchUriAsync(new Uri("se-myapp:///something"));
一切似乎都正常-激活事件/覆盖触发,应用程序实际激活并显示,但在我的OnActivated代码完成后,出现以下错误:

The operation cannot be completed because the window is being closed. (Exception from HRESULT: 0x802A0201)
我能做些什么来让它工作?有什么想法吗

出现的调用堆栈是这样的(没有用户代码,未处理的异常事件无法处理)

mscorlib.dll!System.Threading.Tasks.AwaitTaskContinuation.Throwasyncifned.AnonymousMethod__1(对象s)+0x33字节 mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WaitCallback_上下文(对象状态)+0x3e字节 mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext ExecutionContext,System.Threading.ContextCallback回调,对象状态,bool preserveSyncCtx)+0xa7字节 mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext ExecutionContext,System.Threading.ContextCallback回调,对象状态,bool preserveSyncCtx)+0x16字节 mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()+0x60字节 mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch()+0x149字节 mscorlib.dll!System.Threading.\u ThreadPoolWaitCallback.PerformWaitCallback()+0x5字节 [本机到托管转换]

你不能

很遗憾,您正在尝试混合不应混合的内容。如果您为应用程序创建自定义协议激活,则调用包含该协议的uri将启动您的应用程序。共享魅力将仅激活具有共享目标合约的应用程序。无例外


这里有一些关于协议激活的更多信息。您可能会发现它很有用:

解决方案相当简单,虽然有些老派(尽管WinRT完全支持)

步骤0:定义要在应用程序中使用的命名事件:

public static EventWaitHandle GetActivationEvent()
{
    EventWaitHandle sync = new EventWaitHandle(false, EventResetMode.ManualReset, Constants.ActivationEventName);
    return sync;
}
步骤1:在OnActivate()覆盖中,获取并设置该事件:

using (var sync = Utils.GetActivationEvent())
{
    sync.Set();
}
步骤2:从共享目标开始,通过以下方式激活自己:

using (EventWaitHandle sync = Utils.GetActivationEvent())
{
    await Launcher.LaunchUriAsync(new Uri(String.Format("my-protocol:///?id={0}&operation={1}", id, op)));
    await Task.Run(() => sync.WaitOne(5000));
    this.m_shareOperation.ReportCompleted();
}

就是这样。这将确保Windows不会感到困惑,不会同时抱怨应用程序的关闭和打开。

这确实有效,只是在Windows 8.1上遇到了相同的问题,并解决了问题。谢谢!!