如何在C#中嵌入VBS并运行它?

3

我有一个工作正常的VBScript。我有一个可以使用cscript程序运行VBScript的C#程序。

我想要将VBS嵌入到C# exe中,使其成为一个单一文件,并能够运行VBS文件。有没有办法将嵌入的VBScript文件作为参数传递给cscript或以其他方式运行嵌入的VBS文件?


relevant: https://dev59.com/xUzSa4cB1Zd3GeqPmnPl?rq=1 - user69820
2个回答

6
Type scriptType = Type.GetTypeFromCLSID(Guid.Parse("0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC"));

dynamic obj = Activator.CreateInstance(scriptType, false);
obj.Language = "vbscript";
string vbscript = "msgbox(\"test\")";
obj.Eval(vbscript);

以下是一个WinForms应用程序的工作示例,可以实现这个功能:http://cheeso.members.winisp.net/srcview.aspx?dir=script&file=ScriptHost.zip - Cheeso
我应该如何格式化VBScript的语法才能使其正常工作?msgbox示例可以工作,但是当我尝试使用VBScript保留字运行我的脚本时,我会收到语法错误。 - Jack
1
@L.B 这个不起作用:Wscript.Echo("hello")。你有什么想法吗? - Dan W
@DanW 你的问题的答案(11年晚了)是WScript.Echo只有在通过WScript.exeCScript.exe主机运行脚本时才可用。这也适用于其他WScript命令,比如WScript.Sleep - undefined

3

另一种方法是通过子进程执行CSCRIPT.EXE:

Process.Start("cscript.exe", "C:\\myscript.vbs");

但是,请记住,.NET 和 C# 与 VBS 脚本非常兼容。你可能想直接将 VBS 代码重写为 C# 程序。


1
如果没有路径,嵌入式资源要如何工作?我正在使用Assembly.GetExecutingAssembly().GetManifestResourceStream("script.vbs")) - Jack
将您的资源提取到临时文件中,使用CScript执行临时文件。然后删除临时文件? - Paul Farry
1
@PaulFarry 嗯,显然我可以这样做,但我正在尝试找到一种不会暴露文件的方法。 - Jack
@Jack 抱歉,但这并不明显。你在问题或评论中没有说明这是你测试过的东西。 - Paul Farry
1
@PaulFarry 我已经提到过我可以从C#程序中运行该文件。我说:“我想要做的是将VBS嵌入到C# exe中,这样就可以成为一个单一的文件并能够运行VBS文件。”以及“有其他运行嵌入式VBS文件的方法吗?” - Jack
我认为你的理想解决方案是将VBS代码转换为C#代码。你可能会发现C#代码更加可靠,可以平稳地处理异常。此外,编译成C#的代码不会暴露VBS文件 ;) - Ted Spence

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接