当前位置: 首页 > 知识库问答 >
问题:

错误CS0535类不实现接口成员

华锦
2023-03-14

我是Visual Studio Xamarin的新手。在现有的xamarin android项目中,我必须添加一个Jar文件(SDK),所以我创建了一个绑定库,但是它引发了一些错误,我试图通过使用metadata.xml来解决这些错误,其中一个如下所示:

在api.xml中搜索,我发现了以下内容:

<class abstract="false" deprecated="not deprecated" extends="android.app.Service" extends-generic-html" target="_blank">aware="android.app.Service" final="false" name="DeviceService" static="false" visibility="public">
<implements name="com.company.deviceService.IDeviceService" name-generic-aware="com.company.deviceService.IDeviceService">
</implements>
<constructor deprecated="not deprecated" final="false" name="DeviceService" static="false" type="com.company.deviceService.DeviceService" visibility="public">
</constructor>
...
<method abstract="false" deprecated="not deprecated" final="false" name="setSignResult" native="false" return="void" static="false" synchronized="false" visibility="public">
<parameter name="p0" type="int">
</parameter>
</method>

<method abstract="false" deprecated="not deprecated" final="false"   name="getSignResult" native="false" return="int" static="false" synchronized="false" visibility="public">
</method>
...
</class>

在接口中有这样的方法:

IntPtr id_setSignResult_I;
        public unsafe void SetSignResult (int p0)
        {
            if (id_setSignResult_I == IntPtr.Zero)
                id_setSignResult_I = JNIEnv.GetMethodID (class_ref, "setSignResult", "(I)V");
            JValue* __args = stackalloc JValue [1];
            __args [0] = new JValue (p0);
            JNIEnv.CallVoidMethod (Handle, id_setSignResult_I, __args);
        }

但是,当我搜索生成的类DeviceService.cs时,我发现了以下内容:

static Delegate cb_setSignResult_I;
#pragma warning disable 0169
        static Delegate GetSetSignResult_IHandler ()
        {
            if (cb_setSignResult_I == null)
                cb_setSignResult_I = JNINativeWrapper.CreateDelegate ((Action<IntPtr, IntPtr, int>) n_SetSignResult_I);
            return cb_setSignResult_I;
        }

        static void n_SetSignResult_I (IntPtr jnienv, IntPtr native__this, int p0)
        {
            global::com.company.deviceService.DeviceService __this = global::Java.Lang.Object.GetObject<global::com.company.deviceService.DeviceService> (jnienv, native__this, JniHandleOwnership.DoNotTransfer);
            __this.SignResult = p0;
        }
#pragma warning restore 0169

        static IntPtr id_getSignResult;
        static IntPtr id_setSignResult_I;

        public virtual unsafe int SignResult {
            // Metadata.xml XPath method reference: path="/api/package[@name='com.company.deviceService']/class[@name='DeviceService']/method[@name='getSignResult' and count(parameter)=0]"
            [Register ("getSignResult", "()I", "GetGetSignResultHandler")]
            get {
                if (id_getSignResult == IntPtr.Zero)
                    id_getSignResult = JNIEnv.GetMethodID (class_ref, "getSignResult", "()I");
                try {

                    if (GetType () == ThresholdType)
                        return JNIEnv.CallIntMethod  (Handle, id_getSignResult);
                    else
                        return JNIEnv.CallNonvirtualIntMethod  (Handle, ThresholdClass, JNIEnv.GetMethodID (ThresholdClass, "getSignResult", "()I"));
                } finally {
                }
            }
            // Metadata.xml XPath method reference: path="/api/package[@name='com.company.deviceService']/class[@name='DeviceService']/method[@name='setSignResult' and count(parameter)=1 and parameter[1][@type='int']]"
            [Register ("setSignResult", "(I)V", "GetSetSignResult_IHandler")]
            set {
                if (id_setSignResult_I == IntPtr.Zero)
                    id_setSignResult_I = JNIEnv.GetMethodID (class_ref, "setSignResult", "(I)V");
                try {
                    JValue* __args = stackalloc JValue [1];
                    __args [0] = new JValue (value);

                    if (GetType () == ThresholdType)
                        JNIEnv.CallVoidMethod  (Handle, id_setSignResult_I, __args);
                    else
                        JNIEnv.CallNonvirtualVoidMethod  (Handle, ThresholdClass, JNIEnv.GetMethodID (ThresholdClass, "setSignResult", "(I)V"), __args);
                } finally {
                }
            }
        }

由于某种原因,绑定生成器不正确地推断方法实现或返回类型,我不知道,研究api.xml似乎是正确的:void setSignResult(int p0)。我试图通过使用metadata.xml修改行为,但错误相同:

  <attr path="/api/package[@name='Com.Company.deviceservice']/class[@name='DeviceService']/method[@name='SetSignResult' 
    and count(parameter)=1
    and parameter[1][@type='int']]/parameter[1]"
    name="managedReturn">Java.Lang.Void</attr>

我找了另一个接口方法的实现,和之前提到的类似的方法进行了比较,我发现它正确的生成了方法,看一下:

static IntPtr id_bcrSymbologyToText_I;
        [Register ("bcrSymbologyToText", "(I)Ljava/lang/String;", "GetBcrSymbologyToText_IHandler")]

        public virtual unsafe string BcrSymbologyToText (int p0)
        {
            if (id_bcrSymbologyToText_I == IntPtr.Zero)
                id_bcrSymbologyToText_I = JNIEnv.GetMethodID (class_ref, "bcrSymbologyToText", "(I)Ljava/lang/String;");
            try {
                JValue* __args = stackalloc JValue [1];
                __args [0] = new JValue (p0);

                if (GetType () == ThresholdType)
                    return JNIEnv.GetString (JNIEnv.CallObjectMethod  (Handle, id_bcrSymbologyToText_I, __args), JniHandleOwnership.TransferLocalRef);
                else
                    return JNIEnv.GetString (JNIEnv.CallNonvirtualObjectMethod  (Handle, ThresholdClass, JNIEnv.GetMethodID (ThresholdClass, "bcrSymbologyToText", "(I)Ljava/lang/String;"), __args), JniHandleOwnership.TransferLocalRef);
            } finally {
            }
        }

请很快需要你的帮助!

共有1个答案

袁鸿畴
2023-03-14

找到答案:

Xamarin Binding Generator(负责绑定库)以错误的方式将一些java类转换到C#类,因为它无法执行reingenieering,所以Generator创建了一个setSignResult作为java方法的属性结果。解决这些问题的方法是使用metadata.xml来处理某些类型的错误,或者在我的例子中,通过创建一个具有相同自动生成类名的分部类来实现丢失的方法。由于Binding Generator用自己的实现创建了DeviceService分部类,所以我用以下实现创建了另一个DeviceService分部类,实现了missing方法:

public partial class DeviceService
    {
        public void SetSignResult(int p)
        {
            SignResult = p;
        }
}

工作完美!

感谢所有人

 类似资料:
  • 我试图用Xamarin创建一个Android Java绑定库。我有以下错误: 错误CS0535:'eu.myPackage.MyClass'未实现接口成员'eu.myPackage.iProgressableTask.doProgress(params java.lang.Object[])'(CS0535) 这是java代码: 拜托,你能帮忙解决这个吗?

  • 我很难协调以下文件中的内容: 当我尝试编译它时,我得到以下错误消息: 这很好,所以这意味着我应该能够通过明确指定财产权的对象类型来绕过这个问题? 除了现在的问题之外,当我使用编译时,我会收到以下错误消息: 似乎不管我做什么,我都会输,因为如果我小心界面上的类型规格并拼出所有内容,那么我就不能将实现专门化为只有1种类型。问题是有文件正是这样做的,如果我想让编译器找到所有的类型,因为我想尽可能显式,我

  • 我试图通过visual Studio中的android绑定库将clover.aar文件绑定到xamarin。我把它归结为两个错误: “Decimal”不实现接口成员“icomparable.comapreto(对象)”

  • 但是,我也看到了一种奇怪的方法来重写接口方法: 3.子类只实现接口,但由父类重写接口中的方法: 覆盖接口方法的第三种方法在android框架源代码中非常常见,例如: 这样设计的原因是什么?

  • 我有一个Android的。aar文件。我正试图在我的Xamarin.Android应用程序中使用它。我按照链接https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/binding-an-aar/中给出的步骤进行了操作 但是当我试图构建我的库时,我遇到了以下错误 但仍然得到相同的错误。我

  • Iam获得以下错误:-检查了lib文件夹,它是spring-beans我使用了以下名称空间:-http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/