PDA

View Full Version : Extension + CDelegate.Invoke



ker
04-03-2012, 21:28
Es ist offenbar nicht möglich, innerhalb einer Extension die Invoke funktion eines CDelegate Objektes aufzurufen.
Dies führt in jedem Fall zu einer Exception.


[NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.]
bei stne.CScriptContext.get_Current() in D:\source\arakis\dev1\projects\stne\game\Scripting \Extensions.vb:Zeile 466.
bei stne.Scripting.Types.CScript.GetScript() in D:\source\arakis\dev1\projects\stne\game\Scripting \Objects.vb:Zeile 5420.
bei stne.CImpersonationDelegate.Invoke(Object[] args) in D:\source\arakis\dev1\projects\stne\game\Scripting \Extensions.vb:Zeile 861.

[TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht.]
bei System.RuntimeMethodHandle._InvokeMethodFast(IRunt imeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
bei System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
bei larne.scripting.TScriptObjectMemberNative.GetValue Internal(TScriptContext Context, Object obj, Object[] Index) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 2656.
bei larne.scripting.TScriptObjectMemberNative.GetValue (TScriptContext Context, TCodeExpressionObjectMember CallExp, Object obj, Object[] Index) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 2645.
bei larne.scripting.Expressions.TCodeExpressionObjectM ember.Get(TScriptContext Context) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\ScriptExpressions.cs:Zeile 444.
bei larne.scripting.Commands.TCodeCommandDim.Process(T ScriptContext Context) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\ScriptCommands.cs:Zeile 176.
bei larne.scripting.TScriptContext.ExecuteInternal() in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1193.

Ist das so gedacht, dass das verboten ist? Oder ist das ein Bug?
Falls es verboten ist, gibt es dafür spezielle Gründe? Durch CDelegate.Invoke kann man doch sowieso keine Schiffs oder Kolonie-Aktionen ausführen, weshalb es eh keinen (mir bekannten) Missbrauch ermöglichen würde.

grüße
/ker

Arakis
05-03-2012, 03:06
Hallo ker,
da ich keinen (minnimierten) Quelltext sehe, kann ich dir auch nicht helfen. Verboten ist es nicht. Laut Excetption findet er den ScriptContext nicht bzw. dem Delegaten ist kein Script zugewiesen.

Lieben Gruß,
Arakis

ker
05-03-2012, 08:34
das war natürlich leicht doof von mir... Es geht ohne exception und mit exception geht es nicht... daher hab ich net an ein beispiel gedacht...

Der komplette Fehler:

[NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.]
bei stne.CScriptContext.get_Current() in D:\source\arakis\dev1\projects\stne\game\Scripting \Extensions.vb:Zeile 466.
bei stne.Scripting.Types.CScript.GetScript() in D:\source\arakis\dev1\projects\stne\game\Scripting \Objects.vb:Zeile 5420.
bei stne.CImpersonationDelegate.Invoke(Object[] args) in D:\source\arakis\dev1\projects\stne\game\Scripting \Extensions.vb:Zeile 861.

[TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht.]
bei System.RuntimeMethodHandle._InvokeMethodFast(IRunt imeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
bei System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
bei larne.scripting.TScriptObjectMemberNative.GetValue Internal(TScriptContext Context, Object obj, Object[] Index) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 2656.
bei larne.scripting.TScriptObjectMemberNative.GetValue (TScriptContext Context, TCodeExpressionObjectMember CallExp, Object obj, Object[] Index) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 2645.
bei larne.scripting.Expressions.TCodeExpressionObjectM ember.Get(TScriptContext Context) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\ScriptExpressions.cs:Zeile 444.
bei larne.scripting.Commands.TCodeCommandDim.Process(T ScriptContext Context) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\ScriptCommands.cs:Zeile 176.
bei larne.scripting.TScriptContext.ExecuteInternal() in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1193.

[Exception: Das Script hat einen Laufzeitfehler verursacht. Zeile: 27, Spalte: 7, Token: 'val', Script: 'extension + invoke']
bei larne.scripting.TScriptContext.ExecuteInternal() in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1207.
bei larne.scripting.TScriptContext.CallMethod(TScriptO bjectMemberCustom mem, TCodeExpressionObjectMember Caller, Object[] Args, CObject Instance) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1014.
bei larne.scripting.TScriptContext.CallMethod(TCodeExp ressionObjectMember Caller, Object[] Args, CObject Instance) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 972.
bei larne.scripting.TScriptObjectMemberCustom.GetValue (TScriptContext Context, TCodeExpressionObjectMember CallExp, Object obj, Object[] Index) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1850.
bei larne.scripting.Expressions.TCodeExpressionObjectM ember.Get(TScriptContext Context) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\ScriptExpressions.cs:Zeile 444.
bei larne.scripting.Commands.TCodeCommandDim.Process(T ScriptContext Context) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\ScriptCommands.cs:Zeile 176.
bei larne.scripting.TScriptContext.ExecuteInternal() in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1193.

[Exception: Das Script hat einen Laufzeitfehler verursacht. Zeile: 27, Spalte: 7, Token: 'val', Script: 'extension + invoke']
bei larne.scripting.TScriptContext.ExecuteInternal() in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1207.
bei larne.scripting.TScriptContext.CallMethod(TScriptO bjectMemberCustom mem, TCodeExpressionObjectMember Caller, Object[] Args, CObject Instance) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1014.
bei larne.scripting.TScriptContext.CallMethod(TScriptO bjectMemberCustom Mem, Object[] Args, CObject Instance) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 968.
bei larne.scripting.TScriptObjectMemberCustom.GetValue Internal(TScriptContext Context, Object obj, Object[] Index) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1866.
bei larne.scripting.Types.CDelegate.Invoke(Object[] args) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\ScriptMethods.cs:Zeile 191.
bei stne.TScriptExtensionItem.CallEvent(CGuiEvent e) in D:\source\arakis\dev1\projects\stne\game\Scripting \Extensions.vb:Zeile 182.

[Exception: Es ist ein Fehler in einer Extension aufgetreten. Extension wurde deaktiviert. Bitte wende dich an den Autor der Extension.]
bei stne.TScriptExtensionItem.CallEvent(CGuiEvent e) in D:\source\arakis\dev1\projects\stne\game\Scripting \Extensions.vb:Zeile 194.
bei stne.TScriptExtensionManagerUserItem.CallEvent(CGu iEvent e) in D:\source\arakis\dev1\projects\stne\game\Scripting \Extensions.vb:Zeile 121.
bei stne.TUserSession.CallScriptEvent(CGuiEvent e) in D:\source\arakis\dev1\projects\stne\game\UserLib.v b:Zeile 5889.
bei stne.TstneGamePage.PrepareRender() in D:\source\arakis\dev1\projects\stne\game\WebContro ls.vb:Zeile 718.
bei stne.wf_Game.Page_Load(Object sender, EventArgs e) in D:\source\arakis\dev1\projects\stne\game\Game.aspx .vb:Zeile 128.
bei System.Web.UI.Control.LoadRecursive()
bei System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Assembly: stne.dll
Time: 05.03.2012 07:29:02
Server: DE1
User-ID: 62113
STNE-Version: 1.0.74.395
Compiled at: 01.03.2012 16:40:25
Compiled from: Arakis

Die Extension(nicht vergessen, die eigene id im callback eintragen):

#UseInterface Web, Gui;

Function Init()
{
ScriptContext.EnableExtension();
Var filter As New CGuiEventFilter();
filter.AddPage(EGuiPage.PlanetList);
ScriptContext.RegisterEvent(EGuiEventType.PageBefo reRender, AddressOf callback, filter);

ScriptContext.ActivateEvents();
ScriptContext.WriteAppLog('extension loaded...');
}
Init();

Function callback(e As CGuiEventOnPageBeforeRender)
{
Var tmp As Integer = getValue(62113);
ScriptContext.WriteAppLog('Value: ' & tmp);
}

Function getValue(player_id As Integer) As Integer
{
Var script As New CScript("getValue", player_id);
Var callback_getValue As CDelegate = script.GetDelegate("getValue");
Var objects[1] As Object;
objects[0] = 5;
Var val As Integer = callback_getValue.Invoke(objects);
Return val;
}

Das Delegate (ein script mit dem namen "getValue"):


Public Function getValue(arg As Integer) As Integer
{
Return arg + 1;
}


Das Script das funktioniert(im prinzip einfach nur der inhalt des extension callbacks):


#UseInterface Web;

Var tmp As Integer = getValue(62113);
ScriptContext.WriteAppLog('Value: ' & tmp);

Function getValue(player_id As Integer) As Integer
{
Var script As New CScript("getValue", player_id);
Var callback_getValue As CDelegate = script.GetDelegate("getValue");
Var objects[1] As Object;
objects[0] = 5;
Var val As Integer = callback_getValue.Invoke(objects);
Return val;
}

ker
09-03-2012, 12:04
ich hab jetzt mal den externen scriptaufruf direkt in die extension gepackt, statt in den callback


#UseInterface Web, Gui;

Var script As New CScript("getValue", 62113);
Var callback_getValue As CDelegate = script.GetDelegate("getValue");
Var objects[1] As Object;
objects[0] = 5;
Var val As Integer = callback_getValue.Invoke(objects);
ScriptContext.WriteAppLog('Value: ' & val);

das zugehörige aufzurufende script mit dem namen "getValue"


Public Function getValue(arg As Integer) As Integer
{
Return arg + 1;
}


[Exception: Extensions aren't allowed to run other scripts]
bei stne.Scripting.Types.CScript..ctor(String Name, Int32 UserID) in D:\source\arakis\dev1\projects\stne\game\Scripting \Objects.vb:Zeile 5433.

[TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht.]
bei System.RuntimeMethodHandle._InvokeConstructor(IRun timeMethodInfo method, Object[] args, SignatureStruct& signature, RuntimeType declaringType)
bei System.Reflection.RuntimeConstructorInfo.Invoke(Bi ndingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
bei System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
bei larne.scripting.TScriptObjectMemberNative.GetValue Internal(TScriptContext Context, Object obj, Object[] Index) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 2658.
bei larne.scripting.TScriptObjectMemberNative.GetValue (TScriptContext Context, TCodeExpressionObjectMember CallExp, Object obj, Object[] Index) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 2645.
bei larne.scripting.Expressions.TCodeExpressionObjectM ember.Get(TScriptContext Context) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\ScriptExpressions.cs:Zeile 444.
bei larne.scripting.Commands.TCodeCommandDim.Process(T ScriptContext Context) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\ScriptCommands.cs:Zeile 176.
bei larne.scripting.TScriptContext.ExecuteInternal() in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1193.

[Exception: Das Script hat einen Laufzeitfehler verursacht. Zeile: 3, Spalte: 5, Token: 'script', Script: 'invoke']
bei larne.scripting.TScriptContext.ExecuteInternal() in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1207.
bei larne.scripting.TScriptContext.Execute(Int32 StartLine) in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1244.
bei larne.scripting.TScriptContext.Execute() in D:\source\arakis\dev1\projects\shared\larne.script ing.c#\Script.cs:Zeile 1279.
bei stne.TScript.ExecuteInternal() in D:\source\arakis\dev1\projects\stne\game\Temp3.vb: Zeile 1039.
bei stne.TScript.ExecuteInQueue() in D:\source\arakis\dev1\projects\stne\game\Temp3.vb: Zeile 951.
bei stne.wf_ScriptEdit.act_Execute() in D:\source\arakis\dev1\projects\stne\game\ScriptEdi t.vb:Zeile 474.
bei stne.wf_ScriptEdit.ExecuteAction() in D:\source\arakis\dev1\projects\stne\game\ScriptEdi t.vb:Zeile 100.
bei stne.TstneBasePage.CallExecuteAction() in D:\source\arakis\dev1\projects\stne\game\WebContro ls.vb:Zeile 166.
bei stne.TstneGamePage.CallExecuteAction() in D:\source\arakis\dev1\projects\stne\game\WebContro ls.vb:Zeile 908.
bei stne.wf_ScriptEdit.Run() in D:\source\arakis\dev1\projects\stne\game\ScriptEdi t.vb:Zeile 69.
bei stne.wf_Game.Page_Load(Object sender, EventArgs e) in D:\source\arakis\dev1\projects\stne\game\Game.aspx .vb:Zeile 100.
bei System.Web.UI.Control.LoadRecursive()
bei System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Assembly: larne.scripting.dll
Time: 09.03.2012 10:58:54
Server: DE1
User-ID: 62113
STNE-Version: 1.0.74.395
Compiled at: 01.03.2012 16:40:25
Compiled from: Arakis

Dies ist eine andere Fehlermeldung... vor allem der "Extensions aren't allowed to run other scripts" teil davon widerspricht jetzt deiner Aussage...

Es wäre sehr praktisch wenn das erlaubt wäre. Wenigstens beim Initialisieren des scriptes... Dass es im Callback geht wäre zwar auch noch ein schönes Feature, aber da kann ich nicht abschätzen was für Folgen das haben könnte.

HerrKoch
09-03-2012, 17:07
Also ich selber hatte auch das so erlebt wie du (dass ich keinen Invoke in einer Extention machen kann). Wollte ein bestimmtes Skript in die Toolbar oben einfügen und via Button ausführen. Gab die selbe Meldung wie du hast. Ich musste mich also damit zufrieden geben, dass ich einen Link zum Skript mache und dann auf ausführen klicke.
Ist etwa ein halbes Jahr her, als ich dies getestet habe (wurde also nicht im kürzeren Zeitraum geändert).

Generell konnte ich hierfür aber keinen "sinnvollen" Grund finden, warum es der Extention verboten ist. Weil automatisieren kann ich damit nicht wirklich was. Ich kann es zwar auf "onload" packen, aber trotzdessem muss ich ja die Seite laden um das Skript auszuführen...

LG

Brokkoli
09-03-2012, 17:22
Generell konnte ich hierfür aber keinen "sinnvollen" Grund finden, warum es der Extention verboten ist.

Na Arakis sagte doch schon, dass es nicht verboten ist. Es wird also eher ein Bug sein.

HerrKoch
09-03-2012, 23:20
Naja, da die Fehlermeldung aber eher verboten heißt, dachte ich damals eigentlich nicht an einen Bug. So wars gemeint.^^