Manifest Resource Kullanımı – Resource dosyalarını DLL içerisinde saklamak
Geliştirdiğiniz bir Web Custom Control’ünün bir resim dosyasına (resim haricindeki dosya tiplerinin de bu şekilde kullanılabilir) ihtiyacı olduğunu düşünün. Eminim ki hiçbiriniz bu dosyayı ilgili kontrolü kullandığı web projesine kopyalamakla uğraşmak istemezsiniz. Bu dosyanın var olup olmadığını kontrolün Load event’inde kontrol edebilir ve gerekirse dosyayı DLL içerisinden okuyup bir klasöre kaydedebilirsiniz.
Örneğin aşağıdaki kod “spacer.gif” dosyasının “Images” klasöründe olup olmadığını kontrol ediyor ve eğer bu dosya yerinde değilse, dosyayı DLL içerisinden alıp Images klasörüne kaydediyor.
string m_FilePath = "~/Images/spacer.gif"; if ( ! File.Exists(this.Page.Server.MapPath(m_FilePath))) { System.IO.Stream m_Stream = this.GetType().Assembly.GetManifestResourceStream("MyCustomControlProject.ImageResources.spacer.gif"); byte[] m_Buffer = new byte[m_Stream.Length]; int m_BufferSize = Convert.ToInt32(m_Stream.Length); m_Stream.Read(m_Buffer, 0, m_BufferSize); System.IO.FileStream m_FileStream = new System.IO.FileStream(this.Page.Server.MapPath(m_FilePath), System.IO.FileMode.Create); m_FileStream.Write(m_Buffer, 0, m_BufferSize); m_FileStream.Close(); }
Burada dikkat etmeniz gereken en önemli nokta “GetManifestResourceStream” methoduna vereceğiniz arguman. Bu arguman projenin ismini, klasör yapısını ve dosya ismini içermek zorunda. Benim kullanmış olduğum “MyCustomControlProject.ImageResources.spacer.swf” örneğinde projenin ismi “MyCustomControlProject” ve “spacer.gif” dosyası da “ImageResources” klasörü içerisinde.
Dikkat edilmesi gereken bir diğer nokta ise, bu dosyaya “Solution Explorer” ekranında sağ tıklanmalı, “Properties” menüsüne tıklanmalı ve “Build Action” özelliği “Embedded Resource” seçeneği seçilmeli ve proje tekrar build edilmelidir.