예제 #1
0
        private static IEnumerable <KeyValuePair <FileInfo, EklentiTanımlayıcı> > AçıklamaDosyalarıveTanımlayıcılarıAl(DirectoryInfo eklentiKlasörü)
        {
            if (eklentiKlasörü == null)
            {
                throw new ArgumentNullException("eklentiKlasörü");
            }

            //Liste oluştur (<dosya bilgisi, ayrıştırılmış eklenti tanımlayıcı>)
            var sonuç = new List <KeyValuePair <FileInfo, EklentiTanımlayıcı> >();

            //Listeye görüntülenme sırası ve  yol ekle
            foreach (var açıklamaDosyası in eklentiKlasörü.GetFiles("Açıklama.txt", SearchOption.AllDirectories))
            {
                if (!PaketEklentiDosyası(açıklamaDosyası.Directory))
                {
                    continue;
                }

                //dosyayı ayrıştır
                var eklentiTanımlayıcı = EklentiDosyasıAyrıştırıcı.EklentiAçıklamaDosyasıAyrıştırıcı(açıklamaDosyası.FullName);

                //Listeyi doldur
                sonuç.Add(new KeyValuePair <FileInfo, EklentiTanımlayıcı>(açıklamaDosyası, eklentiTanımlayıcı));
            }

            //Görüntüleme sırasına göre listeyi sıralayın. NOT: En düşük DisplayOrder ilk olacaktır, yani 0, 1, 1, 1, 5, 10
            sonuç.Sort((firstPair, nextPair) => firstPair.Value.GörüntülemeSırası.CompareTo(nextPair.Value.GörüntülemeSırası));
            return(sonuç);
        }
예제 #2
0
        public static void EklentileriKaldırıldıOlarakİşaretle(string sistemAdı)
        {
            if (String.IsNullOrEmpty(sistemAdı))
            {
                throw new ArgumentNullException("sistemAdı");
            }

            var dosyaYolu = GenelYardımcı.MapPath(KuruluEklentilerYolu);

            if (!File.Exists(dosyaYolu))
            {
                using (File.Create(dosyaYolu))
                {
                    //Dosyayı oluşturduktan sonra kapatmak için 'using' özelliğini kullanıyoruz
                }
            }


            var  kuruluEklentiSistemAdları    = EklentiDosyasıAyrıştırıcı.KuruluEklentiDosyalarınıAyrıştır(KuruluEklentilerDosyaYolunuAl());
            bool zatenKuruluOlarakİşaretlendi = kuruluEklentiSistemAdları
                                                .FirstOrDefault(x => x.Equals(sistemAdı, StringComparison.InvariantCultureIgnoreCase)) != null;

            if (zatenKuruluOlarakİşaretlendi)
            {
                kuruluEklentiSistemAdları.Remove(sistemAdı);
            }
            EklentiDosyasıAyrıştırıcı.KuruluEklentiDosyasınıKaydet(kuruluEklentiSistemAdları, dosyaYolu);
        }
예제 #3
0
        public static void Initialize()
        {
            using (new TekKullanımlıkKilit(Kilitleyici))
            {
                var eklentiKlasörü = new DirectoryInfo(GenelYardımcı.MapPath(EklentiYolu));
                _gölgeKopyaKlasörü = new DirectoryInfo(GenelYardımcı.MapPath(GölgeKopyaYolu));

                var referenslıEklentiler = new List <EklentiTanımlayıcı>();
                var uyumsuzEklentiler    = new List <string>();

                _başlangıçtaGölgeKopyaKlasörünüTemizle = !String.IsNullOrEmpty(ConfigurationManager.AppSettings["BaşlangıçtaGölgeKopyaKlasörünüTemizle"]) &&
                                                         Convert.ToBoolean(ConfigurationManager.AppSettings["BaşlangıçtaGölgeKopyaKlasörünüTemizle"]);

                try
                {
                    var kuruluEklentiSistemAdları = EklentiDosyasıAyrıştırıcı.KuruluEklentiDosyalarınıAyrıştır(KuruluEklentilerDosyaYolunuAl());

                    Debug.WriteLine("Gölge kopya klasörü oluşturma ve dll sorgulama");
                    //klasörlerin oluşturulduğunu doğrula
                    Directory.CreateDirectory(eklentiKlasörü.FullName);
                    Directory.CreateDirectory(_gölgeKopyaKlasörü.FullName);

                    //bin klasöründeki tüm dosyaların listesini al
                    var binDosyaları = _gölgeKopyaKlasörü.GetFiles("*", SearchOption.AllDirectories);
                    if (_başlangıçtaGölgeKopyaKlasörünüTemizle)
                    {
                        //Gölge kopyalanan eklentileri temizle
                        foreach (var f in binDosyaları)
                        {
                            Debug.WriteLine("Siliniyor " + f.Name);
                            try
                            {
                                File.Delete(f.FullName);
                            }
                            catch (Exception exc)
                            {
                                Debug.WriteLine("Silinirken hata oluştu " + f.Name + ". Hata: " + exc);
                            }
                        }
                    }

                    //açıklama dosyalarını kur
                    foreach (var dfd in AçıklamaDosyalarıveTanımlayıcılarıAl(eklentiKlasörü))
                    {
                        var açıklamaDosyası    = dfd.Key;
                        var eklentiTanımlayıcı = dfd.Value;

                        //Eklenti sürümünün geçerli olduğundan emin olun
                        if (!eklentiTanımlayıcı.DesteklenenSürümler.Contains(TSSürüm.MevcutSürüm, StringComparer.InvariantCultureIgnoreCase))
                        {
                            uyumsuzEklentiler.Add(eklentiTanımlayıcı.SistemAdı);
                            continue;
                        }

                        //doğrulamalar
                        if (String.IsNullOrWhiteSpace(eklentiTanımlayıcı.SistemAdı))
                        {
                            throw new Exception(string.Format("'{0}' eklentisinin sistem adı yoktur . Eklentiye benzersiz bir ad atamayı ve yeniden derlemeyi deneyin.", açıklamaDosyası.FullName));
                        }
                        if (referenslıEklentiler.Contains(eklentiTanımlayıcı))
                        {
                            throw new Exception(string.Format("'{0}' eklenti adı daha önce kullanılmıştır", eklentiTanımlayıcı.SistemAdı));
                        }

                        //Kuruldu olarak ayarla
                        eklentiTanımlayıcı.Kuruldu = kuruluEklentiSistemAdları
                                                     .FirstOrDefault(x => x.Equals(eklentiTanımlayıcı.SistemAdı, StringComparison.InvariantCultureIgnoreCase)) != null;

                        try
                        {
                            if (açıklamaDosyası.Directory == null)
                            {
                                throw new Exception(string.Format("'{0}' açıklama dosyası için dizin çözümlenemiyor", açıklamaDosyası.Name));
                            }
                            //Eklentilerdeki tüm DLL'lerin listesini alın (bin klasörü içindekiler değil!)
                            var eklentiDosyaları = açıklamaDosyası.Directory.GetFiles("*.dll", SearchOption.AllDirectories)
                                                   //gölge kopyalanan eklentileri kaydettirmediğinden emin olun
                                                   .Where(x => !binDosyaları.Select(q => q.FullName).Contains(x.FullName))
                                                   .Where(x => PaketEklentiDosyası(x.Directory))
                                                   .ToList();

                            //Diğer eklenti açıklama bilgileri
                            var anaEklentiDosyası = eklentiDosyaları
                                                    .FirstOrDefault(x => x.Name.Equals(eklentiTanımlayıcı.EklentiDosyaAdı, StringComparison.InvariantCultureIgnoreCase));
                            eklentiTanımlayıcı.OrijinalAssemblyDosyası = anaEklentiDosyası;

                            //Gölge kopya ana eklenti dosyası
                            eklentiTanımlayıcı.ReferanslıAssembly = DosyaÇözücü(anaEklentiDosyası);

                            //Başvurulan tüm derlemeleri şimdi kur
                            foreach (var eklenti in eklentiDosyaları
                                     .Where(x => !x.Name.Equals(anaEklentiDosyası.Name, StringComparison.InvariantCultureIgnoreCase))
                                     .Where(x => !ZatenYüklendi(x)))
                            {
                                DosyaÇözücü(eklenti);
                            }

                            //Eklenti türünü başlat (assembly başına yalnızca bir eklentiye izin verilir)
                            foreach (var t in eklentiTanımlayıcı.ReferanslıAssembly.GetTypes())
                            {
                                if (typeof(IEklenti).IsAssignableFrom(t))
                                {
                                    if (!t.IsInterface)
                                    {
                                        if (t.IsClass && !t.IsAbstract)
                                        {
                                            eklentiTanımlayıcı.EklentiTipi = t;
                                            break;
                                        }
                                    }
                                }
                            }

                            referenslıEklentiler.Add(eklentiTanımlayıcı);
                        }
                        catch (ReflectionTypeLoadException ex)
                        {
                            //Bir eklenti adı ekleyin. Bu şekilde problemli bir eklenti kolayca tespit edebiliriz
                            var msg = string.Format("Eklenti '{0}'. ", eklentiTanımlayıcı.KısaAd);
                            foreach (var e in ex.LoaderExceptions)
                            {
                                msg += e.Message + Environment.NewLine;
                            }

                            var fail = new Exception(msg, ex);
                            throw fail;
                        }
                        catch (Exception ex)
                        {
                            //Bir eklenti adı ekleyin. Bu şekilde problemli bir eklenti kolayca tespit edebiliriz
                            var msg = string.Format("Eklenti '{0}'. {1}", eklentiTanımlayıcı.KısaAd, ex.Message);

                            var fail = new Exception(msg, ex);
                            throw fail;
                        }
                    }
                }
                catch (Exception ex)
                {
                    var msg = string.Empty;
                    for (var e = ex; e != null; e = e.InnerException)
                    {
                        msg += e.Message + Environment.NewLine;
                    }

                    var fail = new Exception(msg, ex);
                    throw fail;
                }


                ReferenslıEklentiler = referenslıEklentiler;
                UyumsuzEklentiler    = uyumsuzEklentiler;
            }
        }