Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Unable to cast object of type 'System.Int32' to type 'System.Object[]
helios300
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

Unable to cast object of type 'System.Int32' to type 'System.Object[]

beantworten | zitieren | melden

Liebe Community,

ich bin neu zu CSharp und bin im Moment am experimentieren..

Ich bekomme jedoch bei einer meiner Funktionen dieses Error und weiß nicht wie ich das beheben soll.
Ich habe gegoogelt aber wurde jedoch nicht schlau, da fast alle ein Problem bei Int32 -> String haben und nicht Int32 -> Object[].

Mein Code:


AutoItX3 au3 = new AutoItX3();
......

while(true)
            {
                au3.WinWaitActive("Notepad");
                while (true)
                {
                    object[] pix = au3.PixelSearch(0, 0, 1920, 1080, 0x1F3560);  //PixelSearch gibt eine 1 aus falls es nichts findet 
                    if (pix.ToString() != "1")
                    {
                        object[] pixCoord = (object[])pix;
                        au3.MouseMove((int)pix[0], (int)pix[1], 10); // Parameter: x, y, speed
                        au3.MouseClick("LEFT", (int)pix[0], (int)pix[1], 2, 10); // Parameter; x, y, x mal clicken, speed
                        break;
                    }
                    Thread.Sleep(200);
                }

                Thread.Sleep(200);
            }
.....


Error:
Fehler
System.InvalidCastException: 'Unable to cast object of type 'System.Int32' to type 'System.Object[]'


Viele Grüße,
h300
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4175

beantworten | zitieren | melden

Laut AutoItX PixelSearch in C# mußt du pix nur als object (nicht als Array) deklarieren. Daher dann auch 2 Zeilen weiter der Cast zu object[].
Und daher mußt du dann weiter für den Arrayzugriff bei MouseMove/Click die Variable pixCoord benutzen.
private Nachricht | Beiträge des Benutzers
helios300
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

Hey Th69,

danke für deine Antwort.

Ich hab die Array Deklaration jetzt entfernt, doch bekomme denselben Fehler bei:


object pix = au3.PixelSearch(0, 0, 1920, 1080, 0x1F3560);
....
object[] pixCoord = (object[])pix;


Gruß,
h300
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4175

beantworten | zitieren | melden

Anscheinend gibt die von dir verwendete Methode PixelSearch einen Int32 (d.h. int) zurück. Laut offizieller Doku sollte das aber nicht so sein: PixelSearch

Kannst du mal bei dir im VS-Editor bei PixelSearch "Gehe zu Definition" (F12) aufrufen und schauen, wie die Methode deklariert ist?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
helios300
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden


dynamic PixelSearch(int nLeft, int nTop, int nRight, int nBottom, int nCol, int nVar = 0, int nStep = 1);
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4175

beantworten | zitieren | melden

Dann ist aber die Exception-Meldung eigenartig (bzgl. Int32)???

Dann probiere mal


dynamic pix = au3.PixelSearch(0, 0, 1920, 1080, 0x1F3560);
if (pix.GetType() == typeof(object[]))
{
   object[] pixCoord = (object[])pix;
   // ...
}
private Nachricht | Beiträge des Benutzers
helios300
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

Zitat von Th69
Dann ist aber die Exception-Meldung eigenartig (bzgl. Int32)???

Dann probiere mal


dynamic pix = au3.PixelSearch(0, 0, 1920, 1080, 0x1F3560);
if (pix.GetType() == typeof(object[]))
{
   object[] pixCoord = (object[])pix;
   // ...
}


Ok das ist etwas komisch..
Ich habe zuerst den Code so umgestellt:


dynamic pix = au3.PixelSearch(0, 0, 1920, 1080, 0x1F3560);  //PixelSearch gibt eine 1 aus falls es nichts findet
                    if (pix.ToString() != "1")
                    {
                        object[] pixCoord = (object[])pix;
                        au3.MouseMove((int)pix[0], (int)pix[1], 10); // Parameter: x, y, speed
                        au3.MouseClick("LEFT", (int)pix[0], (int)pix[1], 2, 10); // Parameter; x, y, x mal clicken, speed
                        break;
                    }


Dann hab ich den Error bekommen:
Fehler
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Cannot convert type 'int' to 'object[]''

Doch dann nahm ich den Code was du geschrieben hast 1 zu 1:


dynamic pix = au3.PixelSearch(0, 0, 1920, 1080, 0x1F3560);
                    if (pix.GetType() == typeof(object[]))
                    {
                        object[] pixCoord = (object[])pix;
                        au3.MouseMove((int)pixCoord[0], (int)pixCoord[1], 10);
                        au3.MouseClick("LEFT", (int)pixCoord[0], (int)pixCoord[1], 2, 10);
                        break;
                    }

Nun funktioniert es..

Was hat


if (pix.GetType() == typeof(object[]))
denn geändert? Ich verstehe das im Moment nicht..
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4175

beantworten | zitieren | melden

Mit pix.GetType() == typeof(object[]) wird explizit der Datentyp überprüft (bevor dann in dem Block die Umwandlung (cast) durchgeführt wird), während bei pix.ToString() != "1" nur überprüft wird, ob die Stringrepräsentation ungleich "1" ist (d.h. alle anderen Datentypen bzw. Werte würden ebenfalls diese Bedingung erfüllen und die darauffolgende Umwandlung liefert dann aber eine Cast-Exception).

Du kannst ja mal bei dem alten Code debuggen (s. [Artikel] Debugger: Wie verwende ich den von Visual Studio?), was genau in pix zurückgeliefert wird.
private Nachricht | Beiträge des Benutzers
helios300
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

Interessant.. Ok ich werde mir das definitiv durchlesen.

Allerdings habe ich gemerkt, dass mein Form ziemlich buggy ist. Ich denke das hat was mit der Autoit Bibliothek zu tun. Es lassen sich einige Funktionen im loop nicht ausführen. Ich klick auf den Standard X Button und es schließt sich nicht usw.

Ich denke, ich muss eine rein C# PixelSearch Funktion finden.
private Nachricht | Beiträge des Benutzers