Pour obtenir la version de mon application, on utilise la classe System.Diagnostics.FileVersionInfo
Dim ver As FileVersionInfo = FileVersionInfo.GetVersionInfo(Environment.GetCommandLineArgs()(0))
Dim MyVer as String = ver.FileMajorPart & "." & ver.FileMinorPart & "." & ver.FileBuildPart & "." & ver.FilePrivatePart
Pour obtenir la version d'un fichier (EXE, DLL, OCX, etc..) quelconque, il suffit de passer le chemin du fichier à la fonction GetVersionInfo
On utilise la fonction GetCommandLineArgs de la classe System.Environment
'Chemin de l'éxécutable'Pour les WinForm, on peut aussi utiliser Application.ExecutablePathDim exepath AsString = Environment.GetCommandLineArgs()(0)
'Répertoire de l'executableDim exedir AsString = exepath.Substring(0, exepath.LastIndexOf("\"c))
On utilise la propriété CommandLine de la classe Environment pour avoir la ligne entière dans une chaines de caratères
Console.WriteLine("La ligne de commande est : {0}", Environment.CommandLine)
On utilise GetCommandLineArgs pour obtenir un tableau de chaines de caractères contenant chaque argument.
'Arguments de ligne de commande
Console.WriteLine("Arguments de ligne de commande")
Dim i AsIntegerDim args AsString() = Environment.GetCommandLineArgs()
Dim j AsInteger = args.Length
For i = 0 To j - 1
Console.WriteLine("Args({0}) = {1}", i, args(i))
Next
On utilise la fonction GetEnvironmentVariables de la classe Environment.
Dim env As IDictionary = Environment.GetEnvironmentVariables()
'Pour afficher une variable dont on connait le nom
Console.WriteLine("USERNAME = {0}", env("USERNAME"))
'Pour lister toutes les variablesDim en As IEnumerator = env.Keys.GetEnumerator()
While en.MoveNext
Console.WriteLine("{0} = {1}", en.Current, env(en.Current()))
EndWhile
On utilise la fonction GetFolderPath de la classe Environment avec l'énumération Environment.SpecialFolder
'Répertoire spéciaux
Console.WriteLine("Répertoire spéciaux")
Dim specfolderenum As Array = [Enum].GetValues(GetType(Environment.SpecialFolder))
For i AsInteger = 0 To specfolderenum.Length - 1
Console.WriteLine(Environment.GetFolderPath(CType(specfolderenum.GetValue(i), Environment.SpecialFolder)))
Next
On utilise la fonction GetLogicalDrives de la classe Environment
'Lecteurs logiques
Console.WriteLine("Lecteurs logiques")
Dim drives() AsString = Environment.GetLogicalDrives()
For i AsInteger = 0 To drives.Length - 1
Console.WriteLine(drives(i))
Next
Il arrive souvent de souhaiter interdire à une application d'avoir plusieurs instances lancées.
Voici une petite classe qui lors du démarrage de l'application, s'assure qu'elle n'est pas déjà en cours d'exécution.
Elle utilise un objet mutex nommé, donc potentiellement visible par tous les autres processus.
Imports System.Threading
Class SingleInstanceApp
Implements IDisposable
Private _siMutex As Mutex
Private _siMutexOwned AsBooleanPublicSubNew(ByVal name AsString)
_siMutex = New Mutex(False, name)
_siMutexOwned = FalseEndSubPublicFunction IsRunning() AsBoolean
_siMutexOwned = _siMutex.WaitOne(0, True)
ReturnNot (_siMutexOwned)
EndFunctionPublicSub Dispose() Implements System.IDisposable.Dispose
If _siMutexOwned Then
_siMutex.ReleaseMutex()
EndIfEndSubEndClass
Pour utiliser notre classe, il suffit de procéder ainsi dans le Main de notre application.
SharedSub Main()
Dim app As SingleInstanceApp = New SingleInstanceApp("{123456789 - ABCD - EFEG - XXXX}")
TryIf app.IsRunning Then
MessageBox.Show("Application déjà lancée")
Else
Application.Run(New Form1)
EndIfFinallyCType(app, IDisposable).Dispose()
EndTryEndSub
Important :
Si une application lambda en cours d'exécution crée un mutex ayant le même nom que celui de notre application, cette dernière ne pourra plus se lancer.
Elle se comportera comme si une autre instance de l'application était déjà en cours.
Il existe une technique pour l'éviter mais cela sort de notre sujet. Veuillez donc à choisir un nom assez compliqué pour votre mutex.
La classe System.Random nous permet de générer des nombres aléatoires. Il s'agit en fait de nombres pseudo-aléatoires, car la séquence générée dépend de l'initialisation.
PrivateSub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'Dim rnd As New Random(100) ' Pour générer toujours la même séquence, on passe la même valeur au constructeur.'Initialisation par défaut basée sur le temp. La séquence est différente à chaque fois.Dim rnd AsNew Random
'Génération de 15 nombres aléatoires compris entre 0 et 255 (Type Byte)Dim rndNumbers AsByte() = NewByte(14) {}
rnd.NextBytes(rndNumbers)
ListBox1.Items.Clear()
For i AsByte = 0 To 14
ListBox1.Items.Add(rndNumbers(i))
'On peut aussi faire un modulo pour n'obtenir que des nombres entre 0 et 100 par exemples
ListBox2.Items.Add(IIf(rndNumbers(i) > 100, rndNumbers(i) Mod 100, rndNumbers(i)))
Next'Pour Générer des nombres aléatoire de type IntegerDim i AsInteger = rnd.Next()
Dim j AsInteger = rnd.Next(500, 1000) 'j sera compris entre 500 et 1000'Pour générer des nombre aléatoire de type Double'd sera compris entre 0,0 et 1,0. 'Il suffit de combiner cet appel à celui de Next() pour avoir des doubles supérieurs à 1,0 Dim d AsDouble = rnd.NextDouble()
EndSub
Pour lancer un processus depuis notre application, on utilise la classe System.Diagnostics.Process
Exemple : lancer une instance de internet explorer qui ouvre www.developpez.com
'Instance de la classe ProcessDim proc AsNew System.Diagnostics.Process()
'Nom de l'executable à lancer
proc.StartInfo.FileName = "iexplore.exe"'Arguments à passer à l'éxécutable à lancer
proc.StartInfo.Arguments="http://www.developpez.com"'Démarrage du processus
proc.Start()
'On libère les ressources dont on a plus besoin.
proc.Close() 'Attention Close ne met pas fin au processus.
On peut ouvrir des documents dont l'extension est connue du shell windows comme les .txt ou les .doc avec la classe System.Diagnostics.Process
Exemple : Ouverture d'un fichier texte .txt.
'Instance de la classe System.Diagnostics.ProcessDim proc AsNew Process()
'Nom du fichier dont l'extension est connue du shell à ouvrir
proc.StartInfo.FileName = "monfichier.txt"'Démarrage du processus. Notepad (si il est associé aux fichiers .txt) sera alors lancé et ouvrira le fichier monfichier.txt
proc.Start()
'On libère les ressources
proc.Close()
Il est possible de rediriger la sortie standard d'un processus et de l'afficher dans un TextBox multiligne par exemple.
Dim proc AsNew Diagnostics.Process
'On désactive le shell
proc.StartInfo.UseShellExecute = False'On redirige la sortie standard
proc.StartInfo.RedirectStandardOutput = True'On définit la commande
proc.StartInfo.FileName = "mem.exe"'Démarrage de la commande
proc.Start()
'Lecture de la sortie de la commandeDim output AsString = proc.StandardOutput.ReadToEnd()
Console.WriteLine(output)
'Attente de la fin de la commande
proc.WaitForExit()
'Libération des ressources
proc.Close()
Pour lister les processus en cours on utilise la fonction
'Pour tous les processus en cours sur l'ordinateur localDim prc as System.Diagnostics.Process() = Process.GetProcesses()
'Pour tous les processus notepad en cours sur l'ordinateur localDim prc as System.Diagnostics.Process() = Process.GetProcessesByName("notepad")
Pour arrêter un processus, il faut disposer d'un objet System.Diagnostics.Process qui représente le processus.
'Pour les applications consoles
proc.Kill()
proc.Close() 'Libération des ressources
Pour les applications WinForm il est préférable d'utiliser CloseMainWindow afin que l'application reçoive le message de fermeture et se ferme correctement.
'Pour les applications avec une interface graphique (et donc une pompe de messages)
proc.CloseMainWindow() 'Si l'appel échoue, on peut alors forcer la fermeture avec Kill.
proc.Close() 'Libération des ressources
La classe System.Convert permet de convertir des objets de types de base. Il existe d'autres méthodes pour le faire mais l'avantage de la classe System.Convert est qu'elle est indépendante du langage utilisé.
System.Convert dispose d'une multitude de méthodes pour effectuer toutes les conversions possibles entre les types de bases.
Voici quelques exemples
'Conversion d'un entier vers une chaine de caractèreDim i as Integer = 10
Dim s as string = Convert.ToString(i)
'Conversion d'une chaine vers un entier
i = Convert.ToInt32(s)
'Notez que si la conversion ne peut se faire, une exception est levée. Ce serait le cas si s = "NonNumérique"
Il est aussi possible d'utiliser la méthode Parse de chaque type de base.
Dim s as String = "35000"Dim i as Integer = Integer.Parse(s)
On peut aussi utiliser l' opérateur de cast CType
Dim s as string = "35000"Dim i as Integer = CType(s, Integer)
Enfin les méthodes VB6 (pour la compatibilité, à éviter pour les nouveaux projets) sont toujours présentes.
Il s'agit de CBool, CInt, CStr, CSingle, etc ....
Dim s as String = "35000"Dim i AsInteger = CStr(s)
Ce qui suit est extrait d'un échange sur le forum dotnet.
C'est très shématique mais cela résume bien comment le .NET Framework s'y prend pour gérer la mémoire
Le .NET Framework : Salut OS, j'ai des trucs à lancer, j'peux te prendre de la ram ? L'OS : Hé Salut ! Je t'en pris, sers-toi ! Le .NET Framework : Sympa mec. J't'en prend 50Mo maintenant, j'ai besoin que de 15 Mo,
mais comme ça je te dérange pas si j'ai besoin de plus.
...
Le .NET Framework : Hé l'OS, t'es short niveau mémoire ? L'OS : Non non, tout va bien. Le .NET Framework : Bon, alors je garde mes 50 Mo encore un peu. L'OS : Oki.
...
SQL Server : Bonjour M. l'OS, j'ai un gros besoin de mémoire...au moins 200 Mo. L'OS : Ben sers-toi donc. SQL Server : Ouais mais y a plus que 180Mo ! L'OS : Ah OK, attend 2 millisecondes stp... L'OS : Hé Framework, tu peux me rendre un peu de RAM ? Le .NET Framework : No problemo, j'te fais ça tout de suite... Le .NET Framework : Garbage Collector, soit un amour et va rendre de la mémoire à l'OS. Garbage Collector : J'y cours patron.
Pour forcer le Garbage Collector à libérer la mémoire inutilisée par le .NET Framework, on peut appeller la méthode Collect de la classe GC.
System.GC.Collect()
Par contre, pour des raisons qui justifieraient à elles seules un article, il n'est pas conseillé d'appeller GC.Collect() directement.
Par conséquent, ne le faites pas à moins d'être un expert du garbage collector.
Pour appeler une fonction présente dans une DLL, vous devez utiliser DllImport et vous devez toujours faire précéder le type de la méthode
du mot clé extern (cela permet de spécifier que la méthode est appelée dans un fichier externe à l'application).
Vous devez aussi connaître :
- le nom de la méthode
- le type qu'elle renvoie
- les paramètres qu'elle peut accepter
Ces informations vous sont généralement fournies avec la documentation de la méthode désirée.
Voici un exemple :
Imports System.Runtime.InteropServices
class Class1
PrivateDeclareFunction FlashWindow Lib"user32.dll" ( _
ByVal hwnd AsInteger, _
ByVal bInvert AsInteger) AsIntegerEnd class
Cette méthode, extraite du fichier user32.dll, renvoie un entier et prend en paramètre 2 autres entiers.
Version sans expression régulière.
On se sert de la fonction Split de la classe String pour parser la chaine, puis on analyse les différentes sous-chaînes.