2017-10-04 41 views
0

问:执行托管的VBScript现代的C#代码

什么免费或商业的脚本主机的C#可以在C#应用程序针对64位架构,运行VBScript?

背景:

这是2017年第三季度 - 前但一些结论这个问题已经被多次提出,很多年长者的代码示例不再起作用。

我正在迁移遗留的VB6 COM DLL到C#服务(DotNet框架4.6.1 +)。 vb6 dll的一个特性是通过MS脚本控制(msscript.ocx)的可扩展性。这使得用户可以编写小的VB sript来在严格的限制内修改应用程序的行为。它运行良好,所以不要进行证明。

新的c#服务必须是64位应用程序。 msscript.ocx是32位AFAIK。理想情况下,我们将用尽可能小的文字替换msscript.ocx的使用。

注:

  1. PowerShell是可能不是一个很好的替代人选,因为这将允许用户访问的能力的潘多拉魔盒。
  2. 我已经看到引用codefluent客户端作为潜在的直接替换,但无法找到示例代码。该产品是否支持vbscript?
  3. 通过某些shell方法执行vbscript作为文件不被认为是可行的,因为脚本必须能够回调C#主机以请求变量。
  4. ActiveXScriptLib是一个潜力。它有一个通过VisualStudio安装的NuGet软件包,并给出了here在x64中为我工作的例子,包括让脚本访问托管c#的提名方法的更复杂的例子。

研究指出:

因为MS引入的第一64位操作系统这一直是一个良好的践踏路径,但是大部分的样本代码的不再在当前的C#运行。

示例代码

作为一个临时修复程序,任何人都可以提供示例代码在C#64位应用程序,可以使用利用msscript.ocx?此示例“将”工作,如果msscript.ocx是访问 - 我得到的错误:

System.Runtime.InteropServices.COMException: 'Retrieving the COM class factory for component with CLSID {0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).'

public void TestScript() 
{ 
    Type scriptType = Type.GetTypeFromCLSID(Guid.Parse("0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC")); 
    dynamic obj = Activator.CreateInstance(scriptType, false); 
    obj.Language = "vbscript"; 
    string vbscript = "2 * 2"; 
    var res = obj.Eval(vbscript); 
    System.Diagnostics.Trace.WriteLine(res); 
} 

编辑:请参阅第4项中添加注释列表 - 显示出一些潜力。

+1

微软的[ClearScript](https://github.com/Microsoft/ClearScript)就是你要找的东西。 –

+0

Thanks @ Kul-Tigin - 看看链接,看看它是一个近期提交的活跃项目,所以迄今为止看起来不错。另外还支持VBScript。 –

回答

1

由于您在您的问题中提及CodeFluent实体,因此它支持VBScript。你可以看看以前的这个条目,它是用于相当高级的场景codefluent-vs-interop-msscriptcontrol-dll或者是这个blog entry的一个非常简单的样例,同时也提到了从nuget获得这个Codefluent运行时客户端的地方。

+0

感谢MCR - 我们即将进入这个项目的这一部分,我会回报。 –