仅限链接器SDK - 将只读成员反序列化为ServiceModel.ExceptionDetail

时间:2017-02-17 08:12:22

标签: android wcf xamarin sdk linker

首先,抱歉我的英文

今天,我遇到了一个不可能解决的问题...

我有两部分申请:

  1. 在Xamarin Android中的应用
  2. PCL(我使用PCL因为应用程序需要在WCF中调用WebService)
  3. 在发布中,如果链接器设置为无,则应用程序就像魅力一样,但是当我想将值设置为仅限SDK时(用于降低APK大小)。我收到了一个错误(见下文)

    堆栈跟踪的一部分:

    System.Runtime.Serialization.InvalidDataContractException: Error on deserializing read-only members in the class: 
    No set method for property 'Message' in type 'System.ServiceModel.ExceptionDetail'.
      at (wrapper managed-to-native) System.Object:__icall_wrapper_mono_delegate_end_invoke (object,intptr)
      at (wrapper delegate-end-invoke) <Module>:end_invoke_object__this___object[]&_IAsyncResult (object[]&,System.IAsyncResult)
    

    PCL呼叫的AsyncCompletedEventArgs中出现错误

    我认为,我需要创建一个“linkDescrption”文件:

    <?xml version="1.0" encoding="utf-8" ?>
    <linker>
      <assembly fullname="System.ServiceModel">
        <type fullname="System.ServiceModel.ExceptionDetail" preserve="fields">
          <field name="Message" />
        </type>
      </assembly>
    </linker>
    

    但我不知道我需要在这个文件中添加什么..

    系统信息:

    • VisualStudio:2013
    • Xamarin插件:最后稳定版
    • JDK:1.8.0_102
    • Android:4.4(Kit kat)
    你能帮帮我吗?如果缺少信息,请告诉我

    提前致谢

1 个答案:

答案 0 :(得分:0)

您已经接近解决方案了 - 实际上,我认为您的链接器配置文件应该可以正常工作。您必须将其构建操作设置为“LinkDescription”。

但是,您的方法非常精细。我可能会尝试阻止整个程序集的链接,看看APK的大小是否足够小以满足您的要求。您可以在Android项目的CSPROJ文件中使用<AndroidLinkSkip/> element

<PropertyGroup>
<AndroidLinkSkip>System.ServiceModel;System.Runtime.Serialization</AndroidLinkSkip>
</PropertyGroup>

请注意,在上面的示例中,我还包含System.Runtime.Serialization,因为它也会导致您遇到问题。随意移除并尝试不用。

https://developer.xamarin.com/guides/android/under_the_hood/build_process/