我想用我用 c# 编写的代码来扩展 vbscript 的功能。我编写了一些类来自动化 SAP GUI,并希望在我拥有的所有 vbscript 文件中使用这些类。
我有数百个 vbscript 文件,并且知道将它们全部转换为 C# 需要数年时间。所以我认为将我的 c# 类公开给 vbscript 会更快。
你知道如何做到这一点或知道我可以学习的任何在线参考资料吗?
VB脚本运行在客户端浏览器运行时里面。
我知道在浏览器中运行的唯一 C# 解决方案是 silverlight。它仍然只是 c#。
[ScriptableMember]
您可以通过使用属性装饰它们来从脚本语言(如 VB- of java-script)访问 c# 代码,如下所示:
/// <summary>
/// Members that can be called from javascript. (or vbscript)
/// </summary>
public sealed class LINEARVIEWER_SL_SCRIPTS {
[ScriptableMember]
public void ChangeNetwork(string pNetworkFilterId, string pNetworkFilter) {
MainViewModel MainVM = (MainViewModel)((MainPage)Application.Current.RootVisual).DataContext;
long SectionID;
if (long.TryParse(pNetworkFilterId, out SectionID) == false) {
throw new FormatException("'" + pNetworkFilterId + "' not a valid section / network ID.");
}
MainVM.RoadFilterViewModel.SelectSectionAsync(SectionID, /* completed handler = */ null);
}
}
您必须在 silverligh (c#) 应用程序启动时注册这些类,如下所示:
private void Application_Startup(object sender, StartupEventArgs e) {
...
HtmlPage.RegisterScriptableObject("LINEARVIEWER_SL_SCRIPTS", new LINEARVIEWER_SL_SCRIPTS());
}
然后,您可以从 java(或 vb)脚本中简单地调用这些方法,如下所示:
function DoAddToLIV(pNetworkFilterId, pNetworkFilter) {
...
gObjLIV.Content.LINEARVIEWER_SL_SCRIPTS.ChangeNetwork(pNetworkFilterId, pNetworkFilter);
...
}
gObjLIB.Content
html 页面内的 silverlight 对象的 id 在哪里。
var gObjLIV = null;
function onSilverlightPluginLoaded(sender, args) {
gObjLIV = sender.getHost();
}
您可以使用此参数将该函数挂钩到 ASPX 页面的 html 中的 silverlight 对象:
<param name="onLoad" value="onSilverlightPluginLoaded" />
如果我遗漏了什么或者您需要更多示例,请告诉我。我不介意。
我不知道您是从命令行还是从 Office 之类的工具中运行 VBScript。
如果是前者,您可以创建一个或多个命令行应用程序,您可以从任何脚本语言调用这些应用程序,并向其中传递参数和操作说明符,就像任何其他命令行工具一样。(在这种情况下还可以考虑迁移到 PowerShell - 它在命令行脚本编写方面比 VBScript 好得多,并且与 .NET 有很好的集成)。
如果是后者,您可能需要使用 RegAsm 注册您的 C# 类,然后按照任何其他 COM 类型创建您的 C# 类型的实例。有关详细信息,请参阅此帖子:如何从 vbScript 调用 .NET 代码 (C#/vb.net)?