Подскажите, каким образом можно запустить кусок JavaScript кода из программы и получить результат? Имеется в виду например c# программа, а не ASP.Net приложение.
Здравствуйте, Kaif, Вы писали:
K>Подскажите, каким образом можно запустить кусок JavaScript кода из программы и получить результат? Имеется в виду например c# программа, а не ASP.Net приложение.
Если отталкиваться от того, что у тебя уже есть ссылка на объекта com-класса SHELL.EXPLORER (p_oleWebBrowser — назовем например так), тогда следующая последовательность:
сначалу получаешь ссылку на Document
this.p_oleWebBrowser.Document
далее:
this.p_oHtmlDocument.parentWindow.execScript(твой скрипт);
например:
this.p_oHtmlDocument.parentWindow.execScript("var " + loNodeObject.p_cID + " = new TreeListControlNode(false,'','','" + loNodeObject.p_cID + "');");
для того чтобы вернуть значение, с этим сложности, но пройдет следующий вариант: в jscript-сценарии у тебя должна быть public-переменная (oReference), в клиенте c# нужно создать свой класс с свойствами, куда ты будешь помещать значения или какой-либо результат выполнения твоего jscript сценария
class MyClass
{
...
public MyParent parent;
...
}
далее в c#-клиенте ты создаешь объект такого класса и данный объект (oClientObject) должен передать в jscript-сценарий посредством вызова другого jscript-сценария:
например так, в jscript сцераии опиши функцию:
var objectvfpclass = '';
function setobject(oClientObject){
oReference = oClientObject;
}
далее выполняешь скрипт на jscript:
например:
function getselectednodeid(id_node){
for(var i=0; i<tree.allNodes.length; i++) {
if (typeof(tree.allNodes[i]) == 'object') {
if (tree.allNodes[i].refKey == id_node){
oReference.parent.p_nid = tree.allNodes[i].ID;
// oReference.parent.p_onodes[id_node]
}
}
}
return oReference.parent.p_nrefkey;
}
удачи...лично я такой вариант делал на vfp, думаю на c# еще проще все это безобразие реализовать...
Здравствуйте, Kaif, Вы писали:
K>Подскажите, каким образом можно запустить кусок JavaScript кода из программы и получить результат? Имеется в виду например c# программа, а не ASP.Net приложение.
Например с помощью MS ScriptControl через COM Interop.
А не лучше ли использовать JScript.NET?
... << RSDN@Home 1.1.4 >>
Здравствуйте, Kaif, Вы писали:
K>Подскажите, каким образом можно запустить кусок JavaScript кода из программы и получить результат? Имеется в виду например c# программа, а не ASP.Net приложение.
...
JScriptCodeProvider provider = new JScriptCodeProvider();
ICodeCompiler compiler = provider.CreateCompiler();
CompilerParameters cp = new CompilerParameters(new string[] {"System.dll"});
cp.GenerateInMemory = true;
cr = compiler.CompileAssemblyFromSource(cp, sourceText /* на javascript*/ );
Assembly asm = cr.CompiledAssembly;
...
а после этого уже
...
Type t = this.asm.GetType("T");
object o = Activator.CreateInstance(t);
MethodInfo mi = t.GetMethod("Method");
object result = mi.Invoke(o, new object[] {........}));
return result;
...
В статье "Visual Studio for Applications Provides Customized Scripting Facilities for Your .NET Project" дохлая ссылка на пример.
> каким образом можно запустить кусок JavaScript кода из программы и получить результат
using System;
using Microsoft.Vsa;
using Microsoft.JScript.Vsa;
using System.Windows.Forms;
namespace WindowsApplication1
{
public class VsaForm : System.Windows.Forms.Form
{
private VsaEngine _Engine = null;
public VsaForm()
{
this.Menu = new MainMenu();
this.Menu.MenuItems.Add("Run", new EventHandler(miRun));
}
private void miRun(object sender, EventArgs e)
{
if (this._Engine == null)
{
this.CreateEngine();
if (this.CompileEngine() == false)
return;
}
this.RunEngine();
}
protected void CreateEngine()
{
HtmlSite hs = new HtmlSite();
this._Engine = new VsaEngine(true);
this._Engine.RootMoniker = "
vsatest://root/";
this._Engine.Site = hs;
hs.SetEngine(_Engine);
}
protected bool CompileEngine()
{
bool ret = false;
try
{
IVsaCodeItem cdi = (IVsaCodeItem)this._Engine.Items["src"];
// JavaScript передает данные в C#, см. HtmlSite.Test(...)
cdi.SourceText = "ext.Test('hello');";
ret = this._Engine.Compile();
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
return ret;
}
protected void RunEngine()
{
try
{
this.StopEngine();
this._Engine.Run();
}
catch (Exception exc)
{
MessageBox.Show(exc.ToString());
}
}
private void StopEngine()
{
if (this._Engine.IsRunning)
this._Engine.Reset();
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
this.StopEngine();
}
}
public class HtmlSite : BaseVsaSite
{
public void SetEngine(VsaEngine engine)
{
this._Engine = engine;
this._Engine.InitNew();
this._Engine.RootNamespace = "vsaroot";
this._Engine.SetOption("fast", true);
this._Engine.SetOption("AlwaysGenerateIL", true);
this._Engine.Items.CreateItem("mscorlib.dll", VsaItemType.Reference, VsaItemFlag.None);
this._Engine.Items.CreateItem("src", VsaItemType.Code, VsaItemFlag.Module);
this._Engine.Items.CreateItem("ext", VsaItemType.AppGlobal, VsaItemFlag.None);
}
private VsaEngine _Engine = null;
public override object GetGlobalInstance(string name)
{
object ret = null;
switch (name.ToLower())
{
case "ext":
ret = this;
break;
default:
throw new VsaException(VsaError.GlobalInstanceInvalid);
}
return ret;
}
public override bool OnCompilerError(IVsaError err)
{
MessageBox.Show(err.ToString(), "CompilerError", MessageBoxButtons.OK, MessageBoxIcon.Stop);
return true;
}
/// <summary>
///
Вызывается из JavaScript
/// </summary>
/// <param name="str"></param>
public void Test(string str)
{
MessageBox.Show(str);
}
}
}
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение