【问题标题】:Remove "virtual" keyword in binding Xamarin library by using metadata.xml使用 metadata.xml 删除绑定 Xamarin 库中的“virtual”关键字
【发布时间】:2015-10-06 17:32:54
【问题描述】:

我正在从 Java 绑定一个 Xamarin 库,它会生成 1 个错误的函数。 关键字应该是override,但目前它是virtual

// Metadata.xml XPath 方法参考:path="/api/package[@name='com.mapbox.mapboxsdk.tileprovider']/class[@name='MapTileLayerBase.CacheTask']/method[@name ='doInBackground' and count(parameter)=1 and parameter[1][@type='java.lang.Object...']]"
[注册("doInBackground", "([Ljava/lang/Object;)Ljava/lang/Void;", "GetDoInBackground_arrayLjava_lang_Object_Handler")]

protected virtual unsafe global::Java.Lang.Object DoInBackground (参数全局::Java.Lang.Object[] p0)

我需要将 virtual 更改为 override,但我不知道该怎么做。

我在网上找到一些cmets说我应该试试这个:

<attr path="/api/package[@name='com.mapbox.mapboxsdk.tileprovider']/class[@name='MapTileLayerBase.CacheTask']/method[@name='doInBackground']" name="virtual">false</attr>

我试过了,但没用。

你知道怎么改吗?

【问题讨论】:

  • 找到解决办法了吗?

标签: android binding xamarin metadata


【解决方案1】:

试试:

<attr path="/api/package[@name='com.mapbox.mapboxsdk.tileprovider']/class[@name='MapTileLayerBase.CacheTask']/method[@name='doInBackground']" name="managedOverride">override</attr>

如果上一步不起作用,则使用更老套的方法:

<attr path="/api/package[@name='com.mapbox.mapboxsdk.tileprovider']/class[@name='MapTileLayerBase.CacheTask']/method[@name='doInBackground']" name="final">true</attr>
<attr path="/api/package[@name='com.mapbox.mapboxsdk.tileprovider']/class[@name='MapTileLayerBase.CacheTask']/method[@name='doInBackground']" name="visibility">protected override</attr>

【讨论】:

    【解决方案2】:

    解决方法是在Metadata.xml映射中将final设置为true

    <attr 
       path="/api/package[@name='com.mapbox.mapboxsdk.tileprovider']/class[@name='MapTileLayerBase.CacheTask']/method[@name='doInBackground']"
       name="final">true</attr>
    

    这有效地从方法签名中删除了virtual 关键字,并且也没有添加final 关键字。奇怪的行为,但它有效。

    【讨论】:

      【解决方案3】:

      1. 在 obj/Debug/generated/src 中找到该类的 MCW (com.mapbox.mapboxsdk.tileprovider.cs)
      2. 将该文件复制到 Additions/ 文件夹并将其包含到项目中。
      3. 必要时将 BuildAction 更改为 Compile
      4. 将虚拟更改为覆盖
      5. 进程中的那个类

      【讨论】:

        【解决方案4】:

        您确定需要在您的 API 中公开此方法吗?您可以使用此线程 http://forums.xamarin.com/discussion/1871/binding-java-library-with-parameter-type-void 中的方法,然后删除此方法。通常这样的方法不会从外部显式使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-30
          • 1970-01-01
          • 1970-01-01
          • 2019-07-26
          相关资源
          最近更新 更多