GetCommandLineArgs 在 VB.NET 上触发“索引超出数组边界”异常

GetCommandLineArgs triggers "Index was outside the bounds of the array" anomaly on VB.NET

提问人:saul rivera 提问时间:8/30/2023 最后编辑:Tu deschizi eu inchidsaul rivera 更新时间:8/30/2023 访问量:56

问:

我有一个用 vb.net 编写的程序,当我从调试器运行时运行良好,但是当我运行.exe文件时,我得到“索引超出了数组的边界”异常。经典的“以前运行良好”的情况。

enter image description here

我在代码中放置了一堆日志,试图捕捉触发异常的位置,重建并运行.exe,我发现它在运行此命令时失败了:

myIntVariable= CInt(Environment.GetCommandLineArgs()(1))
lblStationNum.Text = "Station " + myIntVariable.ToString()

我在属性选项中的命令行参数设置为 1,但似乎当我运行可执行文件时,它默认为 0。(我的变量用于将值分配给“estacion”)

enter image description here

我在 Microsoft 开发人员社区的不同帖子中看到这个问题在许多更新前已修复,所以我很困惑,显示此问题的站正在运行 VS2019 v16.11.23。运行 .NET Framework 4.6.1

任何反馈都是值得赞赏的,如果您需要更多详细信息,请告诉我,几乎没有,因为这是在周末回来后发生的。

我尝试对值进行硬编码,它会导致冲突,因为我需要同时运行应用程序的 6 个独立实例。

vb.net visual-studio-2019 command-line-arguments indexoutofboundsexception

评论

0赞 Tim Schmelter 8/30/2023
好吧,请使用调试器:)
0赞 Tu deschizi eu inchid 8/30/2023
以前运行良好:永远不要这样想或说,它只会阻止您进行适当的故障排除和找到罪魁祸首。
0赞 Craig 8/30/2023
您说“当我运行.exe文件时...”你是怎么做到的?
0赞 Tu deschizi eu inchid 8/30/2023
请记住,即使您的应用程序尚未修改,MS 也会不断更新 .NET 和 .NET Framework。他们可能已经修复了一个错误,允许您执行您不应该做的事情,或者由于测试不足,他们可能在更新中引入了错误。

答:

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
是的,你是对的;但我没有指出这个程序是发布到生产车间站的,并且要求是在桌面上为他们提供一个快捷方式,“带有漂亮的图标”是实际使用的一个短语。我们不希望操作员弄乱命令提示符。