Je rencontre des problèmes avec le moteur de script Roslyn. Je ne reçois aucune exception lors de l'exécution d'un script dans une délégation.Le moteur de script Roslyn ne supprime pas l'exception d'exécution lorsqu'il est utilisé en tant que délégué
test qui fonctionne comme prévu:
string script = @"var a=0; var b=2/a;";
var runner = CSharpScript.Create<object>(script);
var errors = runner.Compile();
Assert.IsTrue(errors.IsEmpty);
try
{
runner.RunAsync();
Assert.Fail("Where is the exception");
}
catch (System.Exception)
{
// everything is OK! Error thrown...
}
Résultat: Non Assertion. L'exception a été lancée.
Voici le texte à l'aide d'un objet délégué:
UnitTest:
string script = @"var a=0; var b=2/a;";
var runner = CSharpScript.Create<object>(script);
var errors = runner.Compile();
var delegat = runner.CreateDelegate();
Assert.IsTrue(errors.IsEmpty);
try
{
delegat();
Assert.Fail("Where is the exception?");
}
catch (System.DivideByZeroException)
{
// everything is OK! Error thrown...
}
Je suis le message d'échec et aucune exception a été levée.
Nous mettons en cache les délégués pour accélérer la compilation et lors d'un test, nous voyons que les exceptions d'exécution ne sont pas levées. J'ai donc écrit le test pour reproduire cette situation.
Je ne trouve aucun indice dans les documents qui décrivent l'absence d'exception lors de l'invocation. Est-ce que quelqu'un peut me donner un pointeur ou un indice pour que cela se produise?
Merci, cela explique tout! Je n'ai pas réalisé le comportement asynchrone de delagates. Donc, je ne peux pas utiliser les délégués dans ma situation, parce que je ne veux pas avoir de threads spawnd pour les très petits scripts qui fonctionnent comme une sorte de déclencheur dans notre application. La seule solution que je vois est de mettre en cache les objets de compilation et non les délégués. Je vais à quelques tests de performance pour voir quelle solution fonctionne mieux. Merci pour la clarification. –
@ PeterHeß Qu'est-ce qui vous fait penser que les fils de ponte vont être un problème? D'autant plus que lorsque le script n'utilise pas 'await', son exécution n'est pas vraiment asynchrone (même si un 'Task' est utilisé pour communiquer son résultat, ce qui rend' await' nécessaire). – svick