我目前正在创建一个运行蒙特卡罗模型的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文件中,该文件可以通过电子邮件发送给用户.
我即将开始一个用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"类型,这听起来特别可怕(和模糊)!
我拼凑了我认为最小的重现案例,并希望有人可以对这个问题提出一些看法.我还发现了一些似乎可以阻止它的调整,但我无法解释原因.
创建一个名为"WSCErrorExample"的新的空"ASP.NET Web应用程序"(我在VS 2013/.net 4.5和VS 2010/.net 4.0中完成了这个,它没有区别)
在项目中添加对"Microsoft.VisualBasic"的引用
添加一个名为"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)