Laden...

[gelöst] MSScriptControl.ScriptControlClass: Zugriff auf Unterklasse des Hauptobjektes nicht möglich

Erstellt von masterchris_99 vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.016 Views
M
masterchris_99 Themenstarter:in
89 Beiträge seit 2006
vor 12 Jahren
[gelöst] MSScriptControl.ScriptControlClass: Zugriff auf Unterklasse des Hauptobjektes nicht möglich

Hallo,

ich möchte in dem genannten ScriptHost auf Unterklassen zugreifen bekomme aber immer die Meldung dass, das Objekt null oder kein Objekt ist. Wenn ich direkt auf Properties des Hauptobjektes zugreife geht alles wunderbar. Nur bei den Unterobjekten bekomme ich es nicht hin. Ich denke aber der Code stellt es besser dar als meine Beschreibung... 😃

MSScriptControl.ScriptControlClass js = new MSScriptControl.ScriptControlClass();
js.AllowUI = false;
js.Language = "JScript";
js.Reset();
js.AddObject("MyObject", myObject, false);

class AAA
{
    public BBB Bbb { get; set; } 
}

class BBB
{
    public CCC Ccc { get; set; }
}

class CCC
{
    public string MyString { get; set; }
}

Und das würde ich gerne machen:

var x = MyObject.Bbb.Ccc.MyString;
49.485 Beiträge seit 2005
vor 12 Jahren

Hallo masterchris_99,

dann musst du die Objekte, die enthalten sein sollen, aber noch erzeugen und der Property zuweisen, z.B. im Konstruktor. Das fällt allerdings unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

Siehe auch [FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt [finden und beheben]

herbivore

M
masterchris_99 Themenstarter:in
89 Beiträge seit 2006
vor 12 Jahren

Die Unterklassen sind natürlich auch erzeugt und mein obiger Code stellt nur ein Beispiel dar da ich meinen eigentlichen Problemquellcode hier nicht zeigen kann/möchte.

Zumal mein Beispielcode auch korrekt sein kann denn ich übergebe das Objekt ja nur an den Scripthost. Wie das Objekt erzeugt wird sieht man hier ja gar nicht.

Aber der vollständigkeitshalber mal kurz zusammgeschrieben:


AAA myObject = new AAA();
myObject.Bbb = new BBB();
myObject.Bbb.Ccc = new CCC();
49.485 Beiträge seit 2005
vor 12 Jahren

Hallo masterchris_99,

es bleibt aber dabei. Die Unterobjekte müssen erzeugt sein.

Zuerst musst du mal herausfinden, bei welchem Objekt das nicht der Fall ist, siehe FAQ-Link. Und als nächstes musst du das Objekt erzeugen (lassen) oder verhindern, dass darauf zugegriffen wird. Steht auch alles in der FAQ.

herbivore

M
masterchris_99 Themenstarter:in
89 Beiträge seit 2006
vor 12 Jahren

So da es hier zu einigen Unstimmigkeiten kam.

Alle Objekte sind korrekt erzeugt und aus dem normalen Code komplett erreichbar! Das Problem tritt nur im Zusammengang mit dem Scripting-Host auf.

Ich habe schnell mal ein Beispielprojekt erzeugt um alles zu testen.

MSScriptControl.ScriptControlClass js = new MSScriptControl.ScriptControlClass();
            AAA myObject = new AAA();
            myObject.Bbb = new BBB();
            myObject.Bbb.Ccc = new CCC();
            myObject.Bbb.Ccc.MyString = "BlaBliBlub";
            
            js.AllowUI = false;
            js.Language = "JScript";
            js.Reset();

            js.AddObject("MyObject", myObject, false);

            js.AddCode(richTextBox1.Text);

            object[] parms = new object[] { 13 };
            //int result = (int)js.Run("test", ref parms);
            //bool result2 = (bool)js.Run("test2", ref parms);
            //string result3 = (string)js.Run("test3", ref parms);

            bool objectIsNull = (myObject.Bbb.Ccc == null);
            MessageBox.Show((objectIsNull) ? "Objekt ist Null" : "Objekt ist nicht Null");
            MessageBox.Show(myObject.Bbb.Ccc.MyString);

            try
            {
                string result = (string)js.Run("Result", ref parms);
                richTextBox2.Text = result;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
    [ComVisible(true)]
    public class AAA
    {
        public BBB Bbb { get; set; }
    }

    public class BBB
    {
        public CCC Ccc { get; set; }
    }

    public class CCC
    {
        public string MyString { get; set; }
    }

Dieser Teil zeigt mir auch dass das Objekt nicht NULL ist und erreichbar:

            bool objectIsNull = (myObject.Bbb.Ccc == null);
            MessageBox.Show((objectIsNull) ? "Objekt ist Null" : "Objekt ist nicht Null");
            MessageBox.Show(myObject.Bbb.Ccc.MyString);
M
masterchris_99 Themenstarter:in
89 Beiträge seit 2006
vor 12 Jahren

[ComVisible(true)] vererbt sich nicht automatisch wie von mir angenommen auf die Unterobjekte sondern muss für jede Klasse explizit hinzugefügt werden.

    [ComVisible(true)]
    public class AAA
    {
        public BBB Bbb { get; set; }
    }

    [ComVisible(true)]
    public class BBB
    {
        public CCC Ccc { get; set; }
    }

    [ComVisible(true)]
    public class CCC
    {
        public string MyString { get; set; }
    }