【问题标题】:InvalidCastException when sharing data and adding to ObservableCollection共享数据并添加到 ObservableCollection 时出现 InvalidCastException
【发布时间】:2016-02-08 04:37:11
【问题描述】:

我正在尝试使用共享合同将数据从 Edge 发送到我的 UWP 应用。它就像一个魅力,除了当我尝试将以这种方式接收到的数据添加到 ObservableCollection<T> 时,我得到了这个异常:

InvalidCastException: 无法将类型为“System.Collections.Specialized.NotifyCollectionChangedEventHandler”的 COM 对象转换为类类型“System.Collections.Specialized.NotifyCollectionChangedEventHandler”。表示 COM 组件的类型的实例不能转换为不表示 COM 组件的类型;但是,只要底层 COM 组件支持对接口的 IID 的 QueryInterface 调用,它们就可以转换为接口。*

代码如下:

App.xaml.cs:

protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
  {
     if (this.SharingService != null)
        await this.SharingService.OnShareTargetActivated(args);
  }

SharingService.cs:

public delegate void UriAddedEventHandler(object sender, UriAddedEventArgs args);
public event UriAddedEventHandler UriAdded;

public async Task OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
   var shareOperation = args.ShareOperation;

   if (shareOperation.Data.Contains(StandardDataFormats.WebLink))
   {
      var uri = await shareOperation.Data.GetWebLinkAsync();

      this.UriAdded?
         .Invoke(this, new UriAddedEventArgs { Uri = uri });
   }
}

ViewModel.cs:

public ViewModel(ISharingService sharingService)
{
   sharingService.UriAdded += OnUriAdded;
}

public ObservableCollection<Uri> collection = new ObservableCollection<Uri>();

private async void OnUriAdded(object sender, UriAddedEventArgs args)
{
   this.collection.Add(args.Uri));
}

当然,集合绑定到页面上的一个元素。

当事件触发时,我似乎在另一个线程上(这并不奇怪),但是将操作包装在一个

await Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, ...)

没有改变任何东西,我仍然得到那个例外。有人知道这里发生了什么吗?

编辑:

为了它的价值,我尝试使用 .NET 原生工具链进行编译并发现了这个警告:

警告:DEP0810:此应用引用 Microsoft.NET.Native.Runtime.1.1,版本 1.1.23231.0,在您的 SDK 中找到,但您在目标上安装了更高版本的 Microsoft.NET.Native.Runtime.1.1机器,1.1.23406.0。如果您继续运行此应用程序,它将针对当前安装的版本 Microsoft.NET.Native.Runtime.1.1 版本 1.1.23406.0 运行。考虑更新您的 SDK 以匹配已安装的 Microsoft.NET.Native.Runtime.1.1 版本。

所以是的,我开始怀疑这里存在版本冲突。我安装了最新的 Windows 10 SDK (10.0.26624.0),所以我不确定如何按照上述警告中的建议更新我的 SDK。

【问题讨论】:

  • this link 可能会有所帮助
  • 好的,看来 Edge 使用的 DLL 版本与我的应用程序不同。问题是,我该如何解决这个问题?
  • 我与 MSFT 确认您的 .net 本机警告是预期的。这里没什么好担心的。

标签: c# windows-10 uwp


【解决方案1】:

每个窗口(您的主应用程序和共享窗口)都有唯一的调度程序。

您不能将 UI 或调度程序从一个窗口直接引用到另一个窗口。

可以调用后台线程,然后使用其他窗口的调度器。

我的建议是摆脱调度程序的所有全局 getter,并使用页面的调度程序(this.Dispatcher)。最佳实践是使用要在其上显示内容的相应控件或页面的调度程序。

【讨论】:

  • 感谢您确认我一直在怀疑的事情。我将通过将 URI 保存到文件(无论如何我都需要这样做)然后从应用程序线程中查看文件来解决这个问题;当文件更新时,我将读取内容并从那里触发 UI 更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
相关资源
最近更新 更多