提问人:saul rivera 提问时间:8/30/2023 最后编辑:Tu deschizi eu inchidsaul rivera 更新时间:8/30/2023 访问量:56
GetCommandLineArgs 在 VB.NET 上触发“索引超出数组边界”异常
GetCommandLineArgs triggers "Index was outside the bounds of the array" anomaly on VB.NET
问:
我有一个用 vb.net 编写的程序,当我从调试器运行时运行良好,但是当我运行.exe文件时,我得到“索引超出了数组的边界”异常。经典的“以前运行良好”的情况。
我在代码中放置了一堆日志,试图捕捉触发异常的位置,重建并运行.exe,我发现它在运行此命令时失败了:
myIntVariable= CInt(Environment.GetCommandLineArgs()(1))
lblStationNum.Text = "Station " + myIntVariable.ToString()
我在属性选项中的命令行参数设置为 1,但似乎当我运行可执行文件时,它默认为 0。(我的变量用于将值分配给“estacion”)
我在 Microsoft 开发人员社区的不同帖子中看到这个问题在许多更新前已修复,所以我很困惑,显示此问题的站正在运行 VS2019 v16.11.23。运行 .NET Framework 4.6.1
任何反馈都是值得赞赏的,如果您需要更多详细信息,请告诉我,几乎没有,因为这是在周末回来后发生的。
我尝试对值进行硬编码,它会导致冲突,因为我需要同时运行应用程序的 6 个独立实例。
答:
0赞
Joel Coehoorn
8/30/2023
#1
在 .Net 中,数组索引以 开头。这意味着是第二个参数,而不是第一个参数。由于参数框中只有单个值,因此这已超过参数数组的末尾,从而导致错误。你想要这个:0
(1)
1
myIntVariable= CInt(Environment.GetCommandLineArgs()(0))
此外,您应该至少更新到 4.6.2,因为 4.6.1 不再收到安全补丁。4.8 系列会更好,甚至可能不需要任何代码更改。
评论
0赞
jmcilhinney
8/30/2023
这个答案是不正确的。返回可执行文件名作为数组的第一个元素,因此您建议的解决方案将始终返回该文件名,无论是否有任何其他参数。原始代码是正确的,以便获得第一个实际参数。问题是 OP 在调试器中未运行时未传递任何实际参数。GetCommandLineArgs
0赞
saul rivera
8/30/2023
#2
我在这里找到了答案
我创建了一个.exe快捷方式,在右键单击->properties->快捷方式上,我在目标上添加了我的参数
例如 目标:“C:\MyAppsLocation\myFile.exe”1
双击快捷方式会发送参数,我的可执行文件现在会运行。
评论
1赞
jmcilhinney
8/30/2023
虽然你所做的事情有效,但你不需要捷径,除非你真的想要捷径。可以从命令行运行应用。您可以打开控制台窗口并键入可执行文件的路径,后跟所需的参数,或者通过右键单击“开始”按钮使用 Windows 的运行功能。您也可以从批处理文件运行它。
0赞
saul rivera
9/1/2023
是的,你是对的;但我没有指出这个程序是发布到生产车间站的,并且要求是在桌面上为他们提供一个快捷方式,“带有漂亮的图标”是实际使用的一个短语。我们不希望操作员弄乱命令提示符。
评论