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