0 oy
525 gösterim
Merhaba. C# projemde programın ihtiyaç duyduğu DLL dosyalarının farklı klasörden yüklenmesini sağlayabilir miyim? Programın exesinin bulunduğu yerde 15-20 tane DLL dosyası olduğu için o klasör çok karmaşık görünüyor. Ben DLL dosyalarını bir tane DLL klasörü oluşturup içine atmak sonrada programın o DLL klasöründen yükleme yapmasını sağlamak istiyorum. Bunu nasıl yapabilirim? Teşekkürler.

1 cevap

0 oy
 
En İyi Cevap

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;
            }
        }
    }

Türkiye'nin en iyi soru cevap sitesi | SorSoyleyelim.com

İlgili sorular


Web sitemiz hakkında ki reklam,istek,öneri ve şikayetlerinizi iletisim(at)sorsoyleyelim.com adresine mail atabilir veya sitemizin iletişim formu üzerinden bize yazabilirsiniz.
Sitede ki içeriklerin izinsiz kullanılması ya da kopyalanması yasaktır. Bknz: Kullanım şartları.
...