Laden...

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

Erstellt von helios300 vor 2 Jahren Letzter Beitrag vor 2 Jahren 1.343 Views
H
helios300 Themenstarter:in
11 Beiträge seit 2021
vor 2 Jahren
Unable to cast object of type 'System.Int32' to type 'System.Object[]

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:> Fehlermeldung:

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

Viele Grüße,
h300

4.931 Beiträge seit 2008
vor 2 Jahren

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.

H
helios300 Themenstarter:in
11 Beiträge seit 2021
vor 2 Jahren

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

4.931 Beiträge seit 2008
vor 2 Jahren

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?

H
helios300 Themenstarter:in
11 Beiträge seit 2021
vor 2 Jahren

dynamic PixelSearch(int nLeft, int nTop, int nRight, int nBottom, int nCol, int nVar = 0, int nStep = 1);

4.931 Beiträge seit 2008
vor 2 Jahren

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;
   // ...
}

H
helios300 Themenstarter:in
11 Beiträge seit 2021
vor 2 Jahren

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:

Fehlermeldung:
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..

4.931 Beiträge seit 2008
vor 2 Jahren

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.

H
helios300 Themenstarter:in
11 Beiträge seit 2021
vor 2 Jahren

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.