我想知道如何使用VB.NET连接到OpenVPN,我尝试使用以下代码但是在命令行中我收到错误“选项错误:在[CMD-LINE]中:1:错误打开配置文件:C:\ Users \ Minetro300 \ Documents \ connection.ovpn 使用--help获取更多信息。“。
IO.File.WriteAllText((System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\vShield" & "\connection.ovpn"), My.Resources.OpenVPNCertificate)
IO.File.WriteAllText((System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\vShield" & "\connection.bat"), "openvpn " & System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\connection.ovpn")
Dim connect As System.Diagnostics.Process
connect = New System.Diagnostics.Process()
connect.StartInfo.FileName = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\vShield" & "\connection.bat"
connect.StartInfo.WindowStyle = ProcessWindowStyle.Normal
connect.Start()
connect.WaitForExit()
答案 0 :(得分:1)
我打算说我不知道你的错误的原因,但是这里有一些建议来编写更好的代码然后我意识到其中一个建议会解决你的问题。查看您在此行中指定的文件的路径:
IO.File.WriteAllText((System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\vShield" & "\connection.ovpn", My.Resources.OpenVPNCertificate)
现在看看你指定的路径,我认为它应该是这行中的同一个文件:
IO.File.WriteAllText((System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\vShield" & "\connection.bat"), "openvpn " & System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\connection.ovpn")
您指定从中读取文件的路径与您指定的文件路径不同,所以难道它无法读取文件吗?
我要给你的关于改进代码的建议是不要多次使用长表达式,而是使用它们一次并将结果赋给变量,然后重用该变量。如果你已经这样做了,那么你第二次就不会搞砸了这条路。所以:
Dim ovpnFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "vShield\connection.ovpn"
您现在可以在需要该路径的任何地方使用该ovpnFilePath
变量,然后您将不会尝试从与您写入的路径不同的路径读取。
该建议代码也包含其他一些改进。首先,导入经常使用的命名空间,然后在代码中不使用它们。例如,System
已导入,因此您无需在代码中使用System.Environment
。更糟糕的是,你在某些地方使用System.Environment
,而在其他地方只使用Environment
,有时候会立即相邻。这是糟糕的编码。如果我在你的代码中看到两个不同的东西,那么我应该能够假设它们是不同的,而不是用同样的方式写两种不同的方式,没有充分的理由。您还应该导入System.IO
命名空间,而不是重复File
IO
。
导入System.IO
命名空间意味着您也可以使用不合格的Path
类,并且您应该使用该类来组合部分路径而不是使用字符串连接。除此之外,永远不要将两个文字连接在一起。这是愚蠢的,并且没有充分的理由使你的代码复杂化。
仔细查看您的代码,我发现您多次使用两个文件路径,并且这两个文件都在同一个文件夹中。我倾向于为这些路径做这件事:
Dim folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "vShield")
Dim ovpnFilePath = Path.Combine(folderPath, "connection.ovpn")
Dim batFilePath = Path.Combine(folderPath, "connection.bat")
这将使您的代码更简单,因此更容易阅读。它将消除您当前的问题,并降低您制作更多内容的可能性。
编辑:这是您正确编写的原始代码:
Dim folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "vShield")
Dim ovpnFilePath = Path.Combine(folderPath, "connection.ovpn")
Dim batFilePath = Path.Combine(folderPath, "connection.bat")
File.WriteAllText(ovpnFilePath, My.Resources.OpenVPNCertificate)
File.WriteAllText(batFilePath, String.Format("openvpn ""{0}""", ovpnFilePath))
Using connect As New Process(batFilePath)
connect.StartInfo.WindowStyle = ProcessWindowStyle.Normal
connect.Start()
connect.WaitForExit()
End Using
正如您所看到的,读取一件事情要容易得多。它不会反复执行相同的操作,因此它可以消除导致您首先发布此问题的错误的机会,即在编写和读取文件时使用不同的路径。
它还摆脱了不必要的限定命名空间。默认情况下已导入System
和System.Diagnostics
,因此无需对其执行任何操作。此代码假定您还导入了System.IO
,您可以在文件或项目级别执行此操作。
我还使用String.Format
来创建命令行,因为它使文件路径用双引号包装更清晰。在这种情况下,这并不是绝对必要的,但它确保如果文件路径中有空格,命令行仍然可以工作,这是完全可能的。
最后,它通过Process
块来正确处理您创建的Using
对象,这会导致在Using
语句中创建的对象被置于End Using
1}}陈述。您应该始终处置您创建的支持它的任何对象。