2016-12-12 4 views
2

Я начал использовать CodeFluentRuntimeClient для замены Interop.MSScriptControl.dll.CodeFluent.RunTime.Client.dll - AccessViolationException

У меня получилось here путем tweeking бит dll, чтобы он работал.

Мы начали использовать dll на производстве. На одной из машин, которые мы установили на нем (Windows Server 2012), у нас есть Sytem.AccessViolationException.

Вот трассировка стека просмотра событий:

enter image description here

enter image description here

Do CodeFluent requieres любые другие библиотеки DLL?

EDIT

Вот код:

public dynamic EvaluateVBScript(string token, string key, string script, IDictionary<string, object> parameterValuePair = null) 
{ 
    try 
    { 
     using (ScriptEngine engine = new ScriptEngine(ScriptEngine.VBScriptLanguage)) 
     { 
      List<object> parameters = new List<object>() { string.IsNullOrEmpty(token) ? string.Empty : ServiceManager.GetService<IServiceInstance>().GetService<IContextManager>(token).UserName }; 
      string extraParameters = string.Empty; 
      if (parameterValuePair != null && parameterValuePair.Count > 0) 
      { 
       extraParameters = "," + string.Join(",", parameterValuePair.Select(e => e.Key)); 
       foreach (var para in parameterValuePair) 
        parameters.Add(para.Value); 
      } 
      string parsedScript = string.Format(@"Function {0}(NecUserProfile {2}) 
      {1} 
      End Function", key, script, extraParameters); 
      ParsedScript parsed = engine.Parse(parsedScript); 

      dynamic value = parsed.CallMethod(key, parameters.ToArray()); 
      return (value != null) ? value.ToString() : string.Empty; 
     } 
    } 
    catch 
    { 
     throw; 
    } 
} 
+0

Можете ли вы опубликовать код, который вы используете для разбора и выполнения сценария? – meziantou

+0

Я отправил код. Кстати, этот код работает на множестве машин. Он ломается только на одной машине. – billybob

+0

Код во время выполнения по существу совпадает с тем, что вы можете найти здесь: http://stackoverflow.com/questions/4744105/parse-and-execute-js-by-c-sharp/24868314 можете ли вы попытаться использовать это код и посмотреть, не сработает ли он? Если да, можете ли вы попробовать его с помощью MarshalAs (UnmanagedType.LPWStr)], добавленным вокруг строковых параметров в ParseText, например там: https://github.com/Taritsyn/MsieJavaScriptEngine/blob/master/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64 .cs –

ответ

0

После некоторых тестов, мы выяснили, что у клиента был антивирус (Kaspersky), установленный на его сервере. Даже после отключения антивируса ошибка нарушения доступа все еще происходила.

После удаления антивируса мы, наконец, смогли выполнить JavaScript. Мы все еще не знаем, какое правило было установлено в антивирусе, который блокировал скрипт для анализа.

Я не тестировал в предлагаемом решении Simon Mounier. Я не знаю, решила бы она проблему.

Решение должно было выкинуть CodeFluent.Runtime.Client.dll и использовать непосредственно исходный код here. Также добавьте MarshalAs(UnmanagedType.LPWStr)] вокруг параметров строки, которые будут использоваться функцией разбора, например, в here.

Смежные вопросы