2010-10-07 3 views
0

J'ai le code suivant:Javascript compilateur .Net génère des erreurs

Dim compiler As ICodeCompiler = New Microsoft.JScript.JScriptCodeProvider().CreateCompiler 
     Dim params As New CompilerParameters 
     params.GenerateInMemory = True 

     Dim res As CompilerResults = compiler.CompileAssemblyFromSource(params, TextBox1.Text.Trim) 
     Dim ass As Assembly = res.CompiledAssembly 
     Dim instance As Object = Activator.CreateInstance(ass.GetType("Foo")) 

     Dim thisMethod As MethodInfo = instance.GetType().GetMethod("FindProxyForURL") 
     Dim str(1) As String 
     str(0) = "" 
     str(1) = "" 

MessageBox.Show(thisMethod.Invoke(instance, str)) 

Essayer de compilateur le folowing code JavaScript:

class Foo {

function FindProxyForURL(url, host) 
     { 
      alert('Test') 
      return "PROXY myproxy.local:8080"; 
     } 
} 

Et obtenir une erreur -

compiler.CompileAssemblyFromSource(params, TextBox1.Text.Trim) 

{C: \ Users \ Me \ AppData \ Local \ Temp \ zfwspah4.0.js (4,65) : erreur JS1135: Variable 'alerte' a pas été déclarée }

Si je retire la ligne "alerte" fonctionne correctement. Je crois que c'est parce que l'alerte est un objet "fenêtre", donc .Net ne le reconnaît pas. J'ai essayé de le remplacer par window.alert ('') mais toujours obtenir la même erreur.

Comment puis-je résoudre ce problème?

+0

Comment proposez-vous l'exécution de votre javascript compilé? Je ne crois pas qu'il existe un moyen de faire cela dans une page Web, donc l'accès à l'objet fenêtre, alerte ou autre, est redondant. – Lazarus

+0

Vous devez ajouter l'implémentation de la fonction Alert à votre assembly compilé. – unclepaul84

+0

La ligne "alert()" ne se termine pas par un ";". Je suppose que cela entraînerait un échec de la compilation, mais il pourrait s'agir simplement d'une erreur de copier-coller dans votre publication, et non de la cause première. – mikemanne

Répondre

1

alert est une fonction fournie par certains environnements hôtes (par exemple, les navigateurs l'ont, mais probablement pas les serveurs). Changement de alert à window.alert n'a pas fait de différence parce que (sur un navigateur) il revient à la même chose. (window est une propriété de l'objet global qui fait référence à l'objet global.) alert est une propriété de l'objet global qui fait référence à une fonction fournie par l'hôte, donc window.alert est la même que alert est la même que window.window.window.alert. digress ...)

Vous devrez utiliser (et probablement importer, ou recevoir en tant que paramètre de fonction, etc.) tout mécanisme fourni par l'environnement hôte dans lequel vous allez exécuter votre code JavaScript compilé .

0

Pour élaborer un peu sur ce qui a été dit. L'objet window fait partie du Domain Object Model d'un navigateur web, à proprement parler, il ne s'agit pas d'un objet javascript mais simplement d'une interface javascript vers un objet navigateur, un proxy si vous le souhaitez. En tant que tel, et le type de référence DOM le donne, il est spécifique au domaine d'exécution, c'est-à-dire qu'il est uniquement disponible pour un interpréteur javascript dans un navigateur Web qu'il lui fournit un DOM. Comme alert est une méthode de l'objet window vous êtes plutôt bloqué sans le DOM. Comme TJ le mentionne, si vous voulez qu'une fenêtre d'alerte pop-up soit disponible pour votre application javascript compilée, alors vous allez devoir l'implémenter pour vous et je serai honnête que je ne sais pas par où commencer . C'est en dehors de la portée de cette question.

Questions connexes