it-swarm.com.de

Xamarin DependencyService: System.MissingMethodException: Standardkonstruktor für [Schnittstelle] nicht gefunden

Diese Fehlermeldung wird angezeigt, wenn Sie den Abhängigkeitsdienst für einen Xamarin.Forms PCL verwenden. Ich habe Antworten auf diesen Fehler gesehen, die iOS und die Linker..__ beinhalten. Ich führe dies jedoch auf Android aus und die Linker ist ausgeschaltet. Debug-Modus auch.

Der Konstruktor sagt mir, dass er den Standardkonstruktor für die Schnittstelle in der PCL nicht finden kann.

Ich dachte, es könnte ein Problem mit einigen Umbenennungen gewesen sein (ich habe das Refactor-Tool verwendet und sichergestellt, dass alle notwendigen Änderungen vorgenommen wurden). Deshalb löschte ich diese Ordner/Dateien und stellte sie neu auf. Immer noch nichts :(

Ich habe das stundenlang gesucht und debuggt. Was könnte diesen Fehler verursachen? Ich bin mir ziemlich sicher, dass meine DependencyService-Implementierungen korrekt sind. 

Hier ist mein verwandter Code.

Schnittstelle:

namespace Enchantum.Functions
{
public interface PaymentProcessor
{

    void setUpCard(String cardNumber,
        int expirationMonth,
        int expirationYear,
        String CVC);

    Task cardTokenizer();

    void backendCardCharge();

}

Android:

[Assembly: Xamarin.Forms.Dependency(typeof(PaymentProcessor_Android))]

namespace Enchantum.Droid.Functions_Android
{
class PaymentProcessor_Android : PaymentProcessor
{
public PaymentProcessor_Android() { }

    private Card mCard;
    private Token mToken;

    public void setUpCard(String cardNumber, int expirationMonth,
        int expirationYear, String cvcCode)
    {
        Card card = new Card
        {
            Number = cardNumber,
            ExpiryMonth = expirationMonth,
            ExpiryYear = expirationYear,
            CVC = cvcCode
        };

        mCard = card;
    }

    public async Task cardTokenizer()
    {
        mToken = await StripeClient.CreateToken(mCard);
    }

    /*TODO: 
     * */

    public void backendCardCharge()
    {
        throw new NotImplementedException();
    }

iOS:

[Assembly: Xamarin.Forms.Dependency(typeof(PaymentProcessor_iOS))]

namespace Enchantum.iOS.Functions_iOS
{
class PaymentProcessor_iOS : PaymentProcessor
{
public PaymentProcessor_iOS() { }

    private Card mCard;
    private Token mToken;

    public void setUpCard(String cardNumber, int expirationMonth,
        int expirationYear, String cvcCode)
    {
        Card card = new Card
        {
            Number = cardNumber,
            ExpiryMonth = expirationMonth,
            ExpiryYear = expirationYear,
            CVC = cvcCode
        };

        mCard = card;

    }

    public async Task cardTokenizer()
    {
        mToken = await StripeClient.CreateToken(mCard);
    }

    /*TODO:*/
    public void backendCardCharge()
    {
        throw new NotImplementedException();
    }




}

Implementierung in einer Xamarin.Form-Inhaltsseite:

DependencyService.Get<PaymentProcessor>().setUpCard(
                    cardNumber,
                    expirationMonth,
                    expirationYear,
                    CVC);

Mein Fehler noch einmal: "System.MissingMethodException: Standardkonstruktor für Typ Enchantum.Functions.PaymentProcessor nicht gefunden"

Was läuft schief?

P.S. Verzeihen Sie meine falsche Benennungskonvention für die Schnittstelle sowie ein anderes Durcheinander. 

14
eeastwood

Vielleicht können Sie versuchen, die Schnittstellenimplementierungsklassen public zu erstellen. Ihre Konstruktoren sind sichtbar, die Klasse selbst jedoch nicht. 

So wie:

[Assembly: Xamarin.Forms.Dependency(typeof(PaymentProcessor_Android))]

namespace Enchantum.Droid.Functions_Android
{
public class PaymentProcessor_Android : PaymentProcessor //make the class public
{

 //your code here

 }
}
9
MangoBoy

Ich habe das gleiche Problem für Linker, wenn ich Linker auf Keine gesetzt habe, funktioniert es 

3
Mina Fawzy

In meinem Fall lag das Problem in der Assembly-Exportlinie.
Die App stürzte ab, da ich anstelle der Klassenimplementierung den Schnittstellentyp verwendete:
[Assembly: Xamarin.Forms.Dependency(typeof(IServiceType))]

Aber die richtige Art und Weise ist die plattformspezifische Implementierung der Schnittstelle:
[Assembly: Xamarin.Forms.Dependency(typeof(ServiceImplementation_Android))]

2
Dr TJ

Ich habe dieselbe Fehlermeldung erhalten, als ich einen Standardkonstruktor definierte, der eine readonly private-Eigenschaft initialisierte. 

Scheint verrückt, aber es macht Sinn, da Java kein Konzept von Readonly hat und die Eigenschaft wahrscheinlich zu einer Konstanten geworden ist.

0
MSC