///
/// Extension methods for the ASP.NET DropDownList control.
///
public static class DropDownListExtension
{
///
/// Select an item in the DropDownList based on the value
///
/// The DropDownList to select from
/// The value to select
public static void SelectItemByValue(this System.Web.UI.WebControls.DropDownList dropDownList, string valueToSelect)
{
try
{
dropDownList.SelectedIndex = dropDownList.Items.IndexOf(dropDownList.Items.FindByValue(valueToSelect));
}
catch (Exception ex)
{
throw new ApplicationException("Unable to set value to " + valueToSelect, ex);
}
}
///
/// Select an item in the DropDownList based on the value after the drop down list has been data bound.
///
/// The DropDownList to select from
/// The value to select
public static void SelectItemByValueAfterDataBound(this System.Web.UI.WebControls.DropDownList dropDownList, string valueToSelect)
{
dropDownList.DataBound += delegate(object sender, EventArgs e) { dropDownList.SelectItemByValue(valueToSelect); };
}
}
Tuesday, February 23, 2010
DropDownList Extension method for selecting by value
Friday, February 12, 2010
Running a class in a seperate AppDomain without loading the assembly into the default AppDomain
Project 1 - AppDomain (Console Application)
Program.cs
This project has no reference to Project 3 (FileLockFail). FileLockFail will not appear in the list of assemblies.
Unloading the created appDomain will release the file lock.
using System;
using System.Reflection;
using Interfaces;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
private const string targetDllName = "FileLockFail.dll";
static void Main(string[] args)
{
string testFileFullPath = CreateTestFile();
#if(DEBUG)
//Copy the DDL that will be loaded into the AppDomain into the working directory.
DirectoryInfo dllDir = new DirectoryInfo(Environment.CurrentDirectory);
string source = Path.Combine(dllDir.Parent.Parent.Parent.FullName, @"FileLockFail\bin\Debug\" + targetDllName);
string destination = Path.Combine(dllDir.FullName, targetDllName);
File.Copy(source, destination, true);
#endif
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationName = "appDomain";
domainSetup.ApplicationBase = Environment.CurrentDirectory;
AppDomain appDomain = AppDomain.CreateDomain("appDomain", null, domainSetup);
ITestMethod otherDomainTestClass = (ITestMethod)appDomain.CreateInstanceAndUnwrap(
targetDllName.Replace(".dll", ""),
"FileLockFail.FailToCloseFileStream");
otherDomainTestClass.TestMethod(testFileFullPath);
try
{
//This should fail due to the file lock still being open.
System.IO.File.Delete(testFileFullPath);
System.Diagnostics.Debug.Fail("Exception expected");
}
catch (IOException)
{
AppDomain.Unload(appDomain);
}
System.IO.File.Delete(testFileFullPath);
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
Console.WriteLine("Assembly: {0}", AppDomain.CurrentDomain.FriendlyName);
foreach (Assembly assembly in assemblies)
{
Console.WriteLine("Loaded: {0}.", assembly.ManifestModule.Name);
}
Console.WriteLine("Press enter");
Console.ReadLine();
}
private static string CreateTestFile()
{
string filePath = Path.Combine(Environment.CurrentDirectory, "TestFile.txt");
using (FileStream fileStream = File.Create(filePath))
{
using (System.IO.StreamWriter fileWriter = new StreamWriter(fileStream))
{
fileWriter.Write("Hello World " + DateTime.Now);
}
}
return filePath;
}
}
}
Project 2 - Interfaces (Class Library)
ITestMethod.cs
Shared interface between both DLL's.
namespace Interfaces
{
public interface ITestMethod
{
void TestMethod(string message);
}
}
Project 3 - FileLockFail (Class Library)
FailToCloseFileStream.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace FileLockFail
{
[Serializable]
public class FailToCloseFileStream : MarshalByRefObject, Interfaces.ITestMethod
{
private static System.IO.FileStream _fileStream = null;
public void TestMethod(string message)
{
Console.WriteLine("Host domain: {0} Message: {1}", AppDomain.CurrentDomain.FriendlyName, message);
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
Console.WriteLine("Assembly: {0}", AppDomain.CurrentDomain.FriendlyName);
foreach (Assembly assembly in assemblies)
{
Console.WriteLine("Loaded: {0}.", assembly.ManifestModule.Name);
}
_fileStream = System.IO.File.OpenWrite(message);
//Don't close the file stream
}
}
}
See Also:
- Specify the path to a config file for the AppDomain MSDN: AppDomainSetup.ConfigurationFile
- Prevent the AppDomain locking the DLL using shadow copy - AppDomain and Shadow Copy
Thursday, February 11, 2010
Running a class in a seperate AppDomain
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
TestClass currentDomainTestClass = new TestClass();
currentDomainTestClass.TestMethod("From current domain");
AppDomain appDomain = AppDomain.CreateDomain("appDomain");
TestClass otherDomainTestClass = (TestClass)appDomain.CreateInstanceAndUnwrap(
typeof(TestClass).Assembly.FullName,
typeof(TestClass).FullName);
otherDomainTestClass.TestMethod("Seperate domain");
Console.ReadLine();
}
}
public class TestClass : MarshalByRefObject
{
public void TestMethod(string message)
{
Console.WriteLine("Host domain: {0} Message: {1}",
AppDomain.CurrentDomain.FriendlyName,
message);
}
}
}
Wednesday, February 10, 2010
Filtering a log4net appender to exclude a logger
<filter type="log4net.Filter.LoggerMatchFilter"> <loggerToMatch value="Logger.To.Filter.Out" /> <acceptOnMatch value="false" /> </filter>
Subscribe to:
Comments (Atom)