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

Posted

技术标签:

【中文标题】我无法在可移植库项目中添加对 ServiceModel 的引用【英文标题】:I can't add a reference to ServiceModel in a portable library project 【发布时间】:2016-04-06 04:09:12 【问题描述】:

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

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

另一个选项是适用于 windows 通用的可移植库。在这种情况下,我无法选择目标项目,这是有道理的,因为它仅适用于通用应用程序。在这种情况下,我可以添加对System.ServiceModel 的引用。

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

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

谢谢。

【问题讨论】:

【参考方案1】:

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

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

如果您只想从特定于平台的 WPF 调用代理 UWP 代码,那么这应该不是问题,但我怀疑您想从业务逻辑代码中调用它们更喜欢在可移植类库中实现。

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

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

【讨论】:

以上是关于我无法在可移植库项目中添加对 ServiceModel 的引用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Xamarin 在可移植类库中保护 WCF 绑定

Maven 和 Eclipse:在 Maven 库项目中加载默认属性并在可运行的 Jar 中使用它

Swift 在可滚动列表中添加项目

无法使用 Vue.js 在可重用组件之间添加自定义内容

无法在可执行 jar 中运行的 java 项目中找到文件

搭建控制台启动服务WCF项目