我无法在可移植库项目中添加对 ServiceModel 的引用

I can't add a reference to ServiceModel in a portable library project

我正在测试 UWP 应用程序,我想使用代理来使用 WCF 服务。我有一个代理,它是 .net 4.6 的库,但我无法将此项目添加为通用应用程序项目中的参考。这很正常,因为它是 .net 4.6 的库。

所以我正在尝试创建一个可移植库,我有两个选项来创建一个可移植库。这个选项让我说出我可以使用哪些目标。我 select .net 4.6 和 windows 通用 10.0。问题是我无法添加对我需要使用代理的 System.ServiceModel 的引用。

另一个选项是 windows 通用的可移植库。在这种情况下,我不能 select 目标项目,这是有意义的,因为它仅适用于通用应用程序。在这种情况下,我可以添加对 System.ServiceModel.

的引用

我知道在可移植库中我只能使用目标项目的库,在这种情况下我猜是 windows 通用的,没有 .net 4.6。但是,为什么我可以在通用应用程序的可移植库中添加引用,而不是在我使用 .net 的可移植库中添加引用?

我想要一个通用的可移植库,以便能够在 WPF 应用程序和通用 windows 应用程序中使用代理。

谢谢。

不幸的是,不同的目标框架之间没有简单的子集关系;也就是说,在您的情况下,UWP 不是 .NET 4.6 的子集,因此当您创建一个针对两者的可移植 class 库时,您不会简单地拥有 smaller[=26= 中的所有 API ] 框架可用。

在处理客户端 System.ServiceModel 代码时,情况更加混乱:尽管两个目标平台都包含对 WCF 代理的基本支持,但 API 差异很大,以至于在创建时没有可用的可移植等效项一个PCL。这就是您所看到的行为的原因:您可以在 .NET 4.6 class 库和 UWP class 库中创建代理,但不能在可移植的class 以它们为目标的库。您将需要创建 2 个单独的库。

如果您只想从平台特定的 WPF 调用代理 UWP 代码,那么这应该不是问题,但我怀疑您想从业务逻辑代码调用它们您更愿意在便携式 class 库中实现。

您可以通过以下方式实现:

  • 在 UWP 和 .NET 4.6 的通用可移植 class 库中为代理 class 创建接口。
  • 从两个特定于平台的 class 库中引用此公共库:UWP 和 .NET 4.6。这两个库中的代理应该实现通用的可移植接口。我还没有尝试过,但是如果您将服务引用配置为重用便携式 class 库中的类型,生成的代理应该已经实现了您的接口。这样你就可以避免在每个平台特定的 class 库中围绕你的代理创建包装器。
  • 您现在可以在通用的可移植 class 库中编写业务逻辑,并且只能使用通用接口使用代理。要在每个平台上获得此接口的具体实例,请使用可移植的依赖注入框架,例如 Ninject.
  • 然后,在每个平台的应用程序代码中,您将通过注册接口的正确代理实现(UWP 或 .NET 4.6)来初始化依赖注入框架。当然,您还将从两个应用程序中引用通用的可移植 class 库,以及每个应用程序中正确的平台特定 class 库。