Windows Server 2008のMSScriptControlの問題
-
14-12-2019 - |
質問
だから私はMSScriptControlを使って私のアプリでJavaScriptを実行するために使用していて、スクリプトが発生する可能性があるエラーに関する情報をいくつか取得できるようにしたいです。
MSScriptControl.ScriptControlClass script = new MSScriptControl.ScriptControlClass();
try
{
script.Language = "JScript";
script.Timeout = 15000;
script.Eval(Code);
}
catch (Exception ex)
{
MSScriptControl.Error err = script.Error;
ret = new Exception("Error on line: " + err.Line + ", Description: " + err.Description);
}
.
コードは、開発マシン、Windows 7ボックスでうまく機能し、エラーのある行番号を表示します。だから私は喜んで発行し、それを常に行われた生産機械に並んでいて、並んで行われ、説明は提供されていません。
私は http://www.microsoft.com/ダウンロード/ ja / details.aspx?id= 1949 最新バージョンをダウンロードするが、インストールは効果がありませんでした。また、プロパティは、Interopタイプをfalseに埋め込むとともに、自分のMSScript.ocxファイルをWindows 2008 ServerのSystem32ディレクトリにコピーするだけでなく、これらの試行は何でも解決されなかった。
だれでも推奨事項を持っていますか?
解決
あなたがいくつかの考えだけに直面する問題に関して:
- リンクによると、このコントロールはWindows 7もWindows 2008 をサポートしていません。
- COM / UACなどに関するセキュリティ問題である可能性があります。
- anycpuをコンパイルした場合、x86 を使ってみてください。
可能な代替案について:
- jscript 評価者はどちらかを簡単に簡単に簡単に簡単にサポートしています.Net 4実行(Windowsを含む)サーバー2008)
他のヒント
3番手以降のすべてのネイティブC#でやりたい場合、または「コンポーネント」の外部依存関係は、このように小さなJScriptブートストラップを備えたCodeDomProvider
を使用します。
private static readonly MethodInfo eval = CodeDomProvider
.CreateProvider("JScript")
.CompileAssemblyFromSource(new CompilerParameters(), "package e{class v{public static function e(e:String):Object{return eval(e);}}}")
.CompiledAssembly
.GetType("e.v")
.GetMethod("e");
private static object JsEval(string jscript)
{
try
{
return eval.Invoke(null, new[] { jscript });
}
catch (Exception ex)
{
return ex;
}
}
.
コード内のどこにでも使用できるJsEval(string)
メソッドをJavaScript(Well JScript)に "eval"にすることができます... SO Calling:
MessageBox.Show("" + JsEval("2 + 2")); // 4
MessageBox.Show("" + JsEval("(function(){ return 3+7; })();")); // 10
MessageBox.Show("" + JsEval("function yay(a) { return a + 1; } yay(2);")); // 3
.
あなたの使い方に応じてあなたはこれらのメンバーを静的にインスタンス化したくないかもしれません。複雑なオブジェクトを操作したい場合は、データを反射的に抽出するためのラッパーを作成する必要があります(または適切なJScriptの対応物としてキャストできますが、JScriptアセンブリを含める必要があるとは限りません)。
これは、JavaScriptをすべてのものにするラッパークラスの例を示します。これはあなたがネイティブにして、ハイレベルの機能を追加するでしょう。あるいはシリアル化と他端の逆シリアル化
private class JsObjectWrapper : IEnumerable
{
public readonly object jsObject;
private static PropertyInfo itemAccessor = null;
private static MethodInfo getEnumerator = null;
public JsObjectWrapper(object jsObject)
{
this.jsObject = jsObject;
if (itemAccessor == null)
{
itemAccessor = jsObject.GetType().GetProperty("Item", new Type[] { typeof(string) });
}
if (getEnumerator == null)
{
getEnumerator = jsObject.GetType().GetInterface("IEnumerable").GetMethod("GetEnumerator");
}
}
public object this[string key]
{
get { return itemAccessor.GetValue(jsObject, new object[] { key }); }
set { itemAccessor.SetValue(jsObject, value, new object[] { key }); }
}
IEnumerator IEnumerable.GetEnumerator()
{
return (IEnumerator)getEnumerator.Invoke(jsObject, null);
}
}
.
これを行うことでこれを行動で見ることができます。
var jsObj = JsEval("var x = { a:7, b:9 };");
var csObj = new JsObjectWrapper(jsObj);
MessageBox.Show("a: " + csObj["a"]); // a: 7
MessageBox.Show("b: " + csObj["b"]); // b: 9
csObj["yay!"] = 69;
foreach (string key in csObj)
{
MessageBox.Show("" + key + ": " + csObj[key]); // "key": "value"
}
.
私は個人的には、1つの点で大きな影響を与え、サーバー環境内での可用性と走行性を保証することができます。これが役立つことを願っています - ck