Evet mümkün. Aşağıda ki class içerisinde ki Hook metodunu programınızın formunu oluşturmadan önce ki aşamada çalıştırırsanız belirttiğiniz dizinden kolaylıkla ilgili DLL dosyalarını yükleyebilirsiniz. Şuan kendi programlarımızda biz de belirttiğiniz şekilde program DLL dosyalarını farklı klasörden yüklenmesini sağlıyor ve bu yöntemi kullanıyoruz. App.Config dosyanızda <probing privatePath="" /> bölümünde herhangi bir yol belirtilmişse bu yolu da kaldırmayı unutmayın. Aşada class da yer alan metodun kullanımı da oldukça basittir. AssemblyResolver.Hook("DLL DİZİNİ"); şeklinde metodu kullanabilirsiniz.
public static class AssemblyResolver {
internal static void Hook(params string[] folders) {
try {
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
// Check if the requested assembly is part of the loaded assemblies
var loadedAssembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.FullName == args.Name);
if (loadedAssembly != null)
return loadedAssembly;
var n = new AssemblyName(args.Name);
if (n.Name.EndsWith(".xmlserializers", StringComparison.OrdinalIgnoreCase))
return null;
if (n.Name.EndsWith(".resources", StringComparison.OrdinalIgnoreCase))
return null;
string assy = null;
// Get execution folder to use as base folder
var rootFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? "";
// Find the corresponding assembly file
foreach (var dir in folders) {
assy = new[] { "*.dll", "*.exe" }.SelectMany(g => Directory.EnumerateFiles(Path.Combine(rootFolder, dir), g)).FirstOrDefault(f =>
{
try {
return n.Name.Equals(AssemblyName.GetAssemblyName(f).Name,
StringComparison.OrdinalIgnoreCase);
}
catch (BadImageFormatException) {
return false; /* Bypass assembly is not a .net exe */
}
catch (Exception ex) {
// Logging etc here
throw;
}
});
if (assy != null)
return Assembly.LoadFrom(assy);
}
// More logging for failure here
return null;
};
}
catch {
throw;
}
}
}