WinForms FAQ - Deployment

Find answers for the most frequently asked questions
Expand All Collapse All

Saar Carmi shows how to do this in his sample found on C# Corner. In it, he uses the Process class in System.Diagnostics to implement this functionality using code such as

[C#]
public static Process RunningInstance()
 {
	Process current = Process.GetCurrentProcess();
 	Process[] processes = Process.GetProcessesByName (current.ProcessName);

	 //Loop through the running processes in with the same name
	 foreach (Process process in processes)
	 {
 		//Ignore the current process
		 if (process.Id != current.Id)
 		{
 			//Make sure that the process is running from the exe file.
			 if (Assembly.GetExecutingAssembly().Location.Replace('/', '\\') == current.MainModule.FileName)
			 {
 				//Return the other process instance.
 				return process;
			 }
		 }
	 }
	 //No other instance was found, return null.
	 return null;
 }

[VB.NET]
Public Shared Function RunningInstance() As Process
	Dim current As Process = Process.GetCurrentProcess()
	Dim processes As Process() = Process.GetProcessesByName(current.ProcessName)
   
	’Loop through the running processes in with the same name
	Dim process As Process
	For Each process In  processes
		’Ignore the current process
		If process.Id <> current.Id Then
			’Make sure that the process is running from the exe file.
			If [Assembly].GetExecutingAssembly().Location.Replace('/', '\') = current.MainModule.FileName Then
 				’Return the other process instance.
				Return process
			End If
		End If
	Next process
	’No other instance was found, return null.
	Return Nothing
End Function ’RunningInstance
Permalink

1) Make sure to follow proper naming conventions for the policy dll. For example, if the original assembly name is TestAssembly.dll then the corresponding policy assembly should be called ‘policy.1.0.TestAssembly.dll’ to make this redirection work for all ‘1.0.*’ version bindings of the original assembly.

2) While specifying the name for the assembly in the policy file, do not include the ‘.dll’ extension.

This is wrong:


>assemblyIdentity name='TestAssembly.dll' publicKeyToken='f638d0a8d5996dd4' culture='neutral' /<

Instead use:


>assemblyIdentity name='TestAssembly' publicKeyToken='f638d0a8d5996dd4' culture='neutral' /<

3) Make sure to sign the policy assembly with the same strong name as the original.

4) Make sure to distribute the policy file along with the policy assembly. Installing the policy assembly in the GAC alone will not suffice. Note that any change made to the policy file after creating the policy assembly will not take effect.

5) Always use /link (to the policy file) in the ‘al’ command while creating the policy assembly. Do not use /embed. It doesn’t seem to be supported.

Some good links:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcreatingpublisherpolicyfile.asp

http://www.newtelligence.com/downloads/downloads-basta2001.aspx

http://www.only4gurus.com/DotNet/studies/managevers.htm

Permalink

The Environment class in the System namespace has this information.

[C#]
	string versionText = Environment.OSVersion.Version.ToString();

[VB.NET]
	Dim versionText As String = Environment.OSVersion.Version.ToString()

The Version property has member properties such as Major and Minor that give additional information.

Note that XP is windows version 5.1

Permalink

You could use EnumWindows with p/Invoke, but using the static Process.GetProcesses() found in the System.Diagnostics namespace will avoid the interop overhead.

[C#]
	Using System.Diagnostics;
	...
	foreach ( Process p in Process.GetProcesses(System.Environment.MachineName) )
	{
		if( p.MainWindowHandle != IntPtr.Zero)
		{
			//this is a GUI app
			Console.WriteLine( p ); // string s = p.ToString();
		}
	}

[VB.NET]
	Imports System.Diagnostics
	...
	Dim p As Process
	For Each p In  Process.GetProcesses(System.Environment.MachineName)
		If p.MainWindowHandle <> IntPtr.Zero Then
			’this is a GUI app
			Console.WriteLine(p) ’ string s = p.ToString();
		End If
	Next p

There is one potential problem on Windows 98. If a process was started with ProcessStartInfo.UseShellExecute set to true, this MainWindowHandle is not available.

Permalink

Use the static Process.GetProcesses() found in the System.Diagnostics namespace.

[C#]
	Using System.Diagnostics; 
	... 
	foreach ( Process p in Process.GetProcesses() ) 
		Console.WriteLine( p ); // string s = p.ToString();

[VB.NET]
	Imports System.Diagnostics
	...
	Dim p As Process
	For Each p In  Process.GetProcesses()
   		Console.WriteLine(p) ’ string s = p.ToString()
	Next p
Permalink

Use the Process class found in the System.Diagnostics namespace.

[C#]
	Process proc = new Process(); 
 	
 	proc.StartInfo.FileName = @'Notepad.exe'; 
 	proc.StartInfo.Arguments = ''; 
	proc.Start(); 

[VB.NET]
	Dim proc As New Process()

	proc.StartInfo.FileName = 'Notepad.exe'
	proc.StartInfo.Arguments = ''
	proc.Start()
Permalink
[C#]
	string s ='';

	System.Net.IPAddress[] addressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;

	for (int i = 0; i < addressList.Length; i ++)
	{
		s += addressList[i].ToString() + '\n';
	}

	textBox1.Text = s; 

[VB.NET]
	Dim s As String = ''

	Dim addressList As System.Net.IPAddress() = Dns.GetHostByName(Dns.GetHostName()).AddressList

	Dim i As Integer
	For i = 0 To addressList.Length - 1
   		s += addressList(i).ToString() + ControlChars.Lf
	Next i

	textBox1.Text = s
Permalink

Share with

Couldn't find the FAQs you're looking for?

Please submit your question and answer.