标签: wsc

在Excel中使用Javascript

我目前正在创建一个运行蒙特卡罗模型的Excel工作簿.虽然模拟器代码目前使用的是Javascript,但考虑到团队对这种语言缺乏经验,完全移植到VBA似乎并非易事.所以,我已经能够将javascript组件合并到一个WSC文件中,该文件运行良好.(以下简化示例.)

    Sub Simulate()
        Set ATPSim = GetObject("script:http://www.example.com/ATPSim.wsc")
        'Set ATPSim = GetObject("script:C:\ATPSim.wsc")
        Dim ParamOne As Integer
        ParamOne = Range("B2").Value
        Dim ParamTwo As Double
        ParamTwo = Range("B3").Value
        Dim ParamThree As Double
        ParamThree = Range("B4").Value
        Range("B1").Value = ATPSim.simulate(ParamOne, ParamTwo, ParamThree)
    End Sub
Run Code Online (Sandbox Code Playgroud)

不幸的是,这需要我托管javascript代码或依靠不熟练的用户来更新绝对路径.有自成一体的解决方案吗?我宁愿将所有内容保存在一个.xlsm文件中,该文件可以通过电子邮件发送给用户.

javascript excel vba wsc

7
推荐指数
1
解决办法
1万
查看次数

C#/ WSC(COM)互操作中的FatalExecutionEngineError

我即将开始一个用VBScript编写的遗留系统的迁移项目.它有一个有趣的结构,因为大部分内容是通过将各种组件编写为"WSC"文件来隔离的,这些文件实际上是以类似COM的方式公开VBScript代码的一种方式.从"核心"到这些组件的边界接口是相当紧凑和众所周知的,所以我希望我能够解决编写新核心并重用WSC,推迟他们的重写.

可以通过添加对"Microsoft.VisualBasic"的引用并调用来加载WSC

var component = (dynamic)Microsoft.VisualBasic.Interaction.GetObject("script:" + controlFilename, null);
Run Code Online (Sandbox Code Playgroud)

其中"controlFilename"是完整的文件路径.GetObject返回类型为"System .__ ComObject"的引用,但可以使用.net的"动态"类型访问属性和方法.

这似乎最初工作正常,但我遇到了很多特定情况的问题 - 我担心这可能发生在其他情况下,或者更糟糕的是,坏事情在很多时候都会发生并被掩盖,等到我最不期望的时候爆炸.

引发的异常是"System.ExecutionEngineException"类型,这听起来特别可怕(和模糊)!

我拼凑了我认为最小的重现案例,并希望有人可以对这个问题提出一些看法.我还发现了一些似乎可以阻止它的调整,但我无法解释原因.

  1. 创建一个名为"WSCErrorExample"的新的空"ASP.NET Web应用程序"(我在VS 2013/.net 4.5和VS 2010/.net 4.0中完成了这个,它没有区别)

  2. 在项目中添加对"Microsoft.VisualBasic"的引用

  3. 添加一个名为"Default.aspx"的新"Web窗体",并将以下内容粘贴到"Default.aspx.cs"的顶部

    using System;
    using System.IO;
    using System.Reflection;
    using System.Runtime.InteropServices;
    using Microsoft.VisualBasic;
    
    namespace WSCErrorExample
    {
        public partial class Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                var currentFolder = GetCurrentDirectory();
                var logFile = new FileInfo(Path.Combine(currentFolder, "Log.txt"));
                Action<string> logger = message =>
                {
                    // The try..catch is to avoid IO exceptions when reproducing by requesting …
    Run Code Online (Sandbox Code Playgroud)

c# asp.net com vbscript wsc

7
推荐指数
1
解决办法
3295
查看次数

标签 统计

wsc ×2

asp.net ×1

c# ×1

com ×1

excel ×1

javascript ×1

vba ×1

vbscript ×1