Dynamically Loading .NET Assembly (32-bit or 64-bit)
Found a nice technique for dynamically loading a native .NET assembly and automatically choosing the appropriate one to match the loading process’s address space (32-bit or 64-bit). The source is located here: http://www.chilkatforum.com/questions/2966/why-separate-32-and-64-bit-chilkat-libraries-for-net and reproduced here:
—
I prefer another solution to this problem. It allows you to have a mix of 32 and 64 bit apps in the same directory.
I install both 32 and 64 bit assemblies into the same directory by renaming them.
ChilkatDotNet4-32.dll ChilkatDotNet4-64.dll
In the project references you just refer to the one you want for that particular project.
Then I get them to load using the AssemblyResolve event which fires when a dll can’t be found.
In Program.Main() add this
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Then add this code somewhere
private const string ChilkatRootFileName = "ChilkatDotNet4";
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name.StartsWith(ChilkatRootFileName, StringComparison.InvariantCultureIgnoreCase))
{
string path = string.Empty;
string current_folder = string.Empty;
try
{
current_folder = Path.GetDirectoryName(new Uri(
Assembly.GetExecutingAssembly().CodeBase).LocalPath);
path = Path.Combine(current_folder, ChilkatRootFileName +
string.Format("-{0}.dll", IntPtr.Size == 4 ? "32" : "64"));
Assembly assembly = Assembly.LoadFrom(path);
return assembly;
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
throw;
}
}
return null;
}