"System.Runtime.Serialization'. Are you missing an assembly reference?" 添加网络参考后

"System.Runtime.Serialization'. Are you missing an assembly reference?" after adding web reference

我有一个共享 PCL 项目的 iOS/Android Xamarin 项目。

我已经根据 Xamarin's Tutorial 通过 ASMX 添加了对 PCL 的网络引用。本教程没有说明如何到达 "Add Web Reference" window,但我们通过右键单击我们的 PCL 项目并转到 Add->Web Reference.[=22= 找到了它。 ]

在添加 Web 引用时,我得到了一个大约 500 行的 Reference.cs 文件,该文件被添加到 PCL.

但是,在编译时,无论是 iOS 还是 Android,我都会遇到以下几个错误:

Reference.cs(74,74): Error CS0234: The type or namespace name IExtensibleDataObject' does not exist in the namespaceSystem.Runtime.Serialization'. Are you missing an assembly reference? (CS0234) (MyProject)

显然我需要添加 System.Runtime.Serialization 程序集引用。但是我不知道该怎么做,我花了几个小时寻找文档或任何相关解决方案。大多数帖子问题充其量看起来是切线的。

这个 forum post 提到了这个问题,但除了据说三年前就已经“修复”之外,没有给出任何解决方案。

现在前面提到的教程引用了一个"Add References…" 对话框来添加System.Web.Services.dll 如果您使用"Add files" 添加代理。但是,我在 IDE.

的任何地方都找不到这个对话框

我在右键单击参考文献时确实找到了 "Edit References"。这产生了带有这些选项卡的 window:

估计这里需要添加程序集,搜索了一下,没有找到。显然没有办法添加与 IDE 一起打包的程序集,您需要 "just know" 在哪里找到它们。查资料无果。

通过示例项目之一,我能够在 /Library/Frameworks/Mono.framework/Versions/4.4.2/lib/mono/xbuild-frameworks/.NETPortable/v4.5/Profile/Profile78/System.Runtime.Serialization.dll 找到 .dll 文件并通过 .NET Assembly 选项卡手动添加它。

一位同事也尝试通过 NuGet 添加引用。

不幸的是,在尝试任何一种方法后编译错误仍然存​​在。

此外,值得注意的是,ToDoASMX 示例项目和包含 System.Runtime.Serialization.dll 的文件夹似乎都引用了本教程提到的 System.Web.Services.dll

我相信这些文档指的是在 Xamarin.iOSXamarin.Android 中使用它们(至少对于 .asmx 文档)。您可以通过右键单击 Xamarin.iOS/Xamarin.Android 项目中的 References 进入 System.Runtime.Serialization,转到 Edit References,然后转到 All 选项卡它应该列在 BCL (Base Class LIbrary) 下。您可能需要在 PCL 中使用基于 Interface 的模式来调用相应的本机 Web 服务。您也可以尝试将 .asmx 包装成 REST service 并使用 HttpClient

查看此示例项目 (https://developer.xamarin.com/samples/xamarin-forms/WebServices/TodoASMX/) 显示了上述基于 Interface 的模式,在 PCL 中使用 ISoapService 并在本机项目中实施。您会看到每个项目 (Droid/iOS) 中都有 Web Reference。 PCL纯粹是调用代码。

考虑到围绕它们构建的框架,使用 .asmx 的更多限制。使用 WCFREST 有更好的选择直接从 PCL 消费。但是请注意,PCLs 将被 NetStandard 库风格所取代。