문제

그래서 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/downlload/en/detail.com/download/ko.now다운로드 / en / details.aspx? ID= 1949 최신 버전을 다운로드하지만 설치는 효과가 없었습니다.또한 속성이 Windows 2008 System32 디렉토리에 내 자신의 Msscript.ocx 파일을 복사 할뿐만 아니라 FALSE에 interop 유형을 false로 설정했지만 이러한 시도가 모두 해결되지 않았습니다.

누구나 권장 사항이 있습니까?

도움이 되었습니까?

해결책

문제와 관련된 문제에 관해서는 몇 가지 생각으로 직면합니다.

  • 이 컨트롤을 제공 한 링크에 따르면 Windows 7 또는 Windows 2008
  • 를 지원하지 않습니다.
  • COM / UAC 등에 대한 보안 문제 일 수 있습니다.
  • AnyCPU를 위해 컴파일 된 경우 비트가 발생하면 문제 일 수 있습니다. x86
  • 를 사용해보십시오.
가능한 대안에 관한

:

다른 팁

타사 또는 "구성 요소"외부 종속성이없는 모든 원시 C # 에서이 작업을 원하시면 다음과 같이 Tiny 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;
    }
}
.

코드의 아무 곳에서나 "eval"자바 스크립트 (잘 JScript)로 "eval"로 사용할 수있는 JsEval(string) 메소드를 만듭니다 ... 그래서 전화 :

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"
}
.

개인적으로 한 지점에서 훌륭한 효과와 비슷한 코드를 사용했으며 서버 환경 내에서 가용성 및 실행 가능성을 위해 보증 할 수 있습니다.이 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top