在现代C#代码

时间:2017-10-04 11:44:11

标签: c# vbscript vb6-migration codefluentruntimeclient

问题:

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

背景

2017年第3季度 - 此主题之前已多次提出,但结论很少,而且许多旧代码示例都不再有效。

我正在将旧版vb6 COM dll迁移到c#服务(Dot Net framework 4.6.1+)。 vb6 dll的一个特性是通过MS Scripting控件(msscript.ocx)的可扩展性。这允许用户编写小的VB脚本来在严格的约束内修改应用程序的行为。它运作良好,所以不要让它合理化。

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

注意:

  1. Powershell可能不是一个好的替代候选者,因为它可以让用户访问Pandoras功能盒。
  2. 我已经看到对codefluent客户端的引用是潜在的直接替代,但找不到示例代码。该产品是否支持vbscript?
  3. 通过某种shell方法将vbscript作为文件执行是不可行的,因为脚本必须能够回调到C#主机以请求变量。
  4. ActiveXScriptLib是一种潜力。它有一个通过VisualStudio安装的NuGet包,给出here的例子在x64中适用于我,包括让脚本访问托管c#的指定方法的更复杂的例子。
  5. 研究笔记:

    自从MS引入第一个64位操作系统以来,这是一条很好的路径,但是大部分示例代码不再在当前的C#中运行。

    示例代码

    作为一个临时解决方案,任何人都可以提供样本代码,以便在可以使用msscript.ocx的C#64位应用程序中使用吗?如果msscript.ocx可以访问,那么这个样本“会”起作用 - 我收到错误:

      

    System.Runtime.InteropServices.COMException:'由于以下错误,检索具有CLSID {0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC}的组件的COM类工厂失败:80040154未注册类(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 个答案:

答案 0 :(得分:1)

由于您在问题中提到了CodeFluent实体,是的,它支持VBScript。您可以从stackoverflow查看此前一个条目,了解相当高级的方案codefluent-vs-interop-msscriptcontrol-dll 或来自此blog entry的一个非常简单的示例,还提到从nuget获取此Codefluent运行时客户端的位置。