终结器的Xamarin.Android绑定代

时间:2016-11-03 17:27:02

标签: android xamarin xamarin.android

是否有正确的方法与终结器一起生成正确的xamarin.android绑定?

我有原始的aar lib,用API level 24编译。此lib已添加到xamarin.android绑定库项目中。 Xamarin在首选项jdk1.8.0_91中定位JDK8。

原始代码有protected void finalize()方法,因此生成的代码如下所示:protected override unsafe void Finalize ()

会导致以下错误:"Do not override object.Finalize. Instead, provide a destructor."

是否有任何建议如何省略这一点,除了使用<remove-node>中的Metadata.xml标记从xamarin一侧生成finalize方法?

2 个答案:

答案 0 :(得分:0)

您应该通过以下方式删除finalize方法:

<remove-node path="/api/package[@name='your.package.name']/class[@name='Proper.ClassName']/method[@name='finalize' and count(parameter)=0]" />

答案 1 :(得分:0)

如果添加 remove-node,则会删除 finalizer,并且永远不会调用 finalize 方法下的代码。 如果您想在析构函数中重复使用 finalize 实现,您可以将以下内容添加到您的 Metadata.xml 文件中:

<!--  
    ClassName class implemented a Java Finalizer. I have to implement a C# Destructor and call the finalize method.
    The C# Destructor is in the partial class under the Addition folder.
-->
<!-- I change the name of the finalizer method to avoid the conflict with java finalizer -->
<attr path="/api/package[@name='your.package.name']/class[@name='ClassName']/method[@name='finalize' and count(parameter)=0]" name="managedName">InternalFinalize</attr>
<!-- I replace the protected override modifier with the internal modifier -->
<attr path="/api/package[@name='your.package.name']/class[@name='ClassName']/method[@name='finalize' and count(parameter)=0]" name="visibility">internal</attr>

注意需要可见性修饰符才能移除 override 修饰符。

然后您应该在文件夹Additions下添加以下类:

namespace Your.Package.Name
{
    public partial class ClassName
    {
        ~ClassName()
        {
            this.InternalFinalize();
        }
    }
}