Rehber C# ile DLL oluşturma, harici DLL modüllerini dahil etme ve kullanma

Merhaba.

Bugün sizlere C# ile DLL oluşturmayı, harici DLL modüllerini dahil edip kullanmayı göstereceğim.

Rehberimiz 3 kısımdan oluşuyor;

  • DLL oluşturma.
  • Oluşturulan DLL'i kullanma.
  • Harici DLL modülü dahil etme ve kullanma.
Öncelikle DLL nedir?

DLL
, uygulama uzantısıdır. *.exe dosyaları kendi içinde barındırmadığı kodları DLL içerisinden çeker.

Normalde DLL olmadan programlar çalışabilir. Ancak güncelleme, geliştirme, farklı programlar için tek bir kitaplık kullanarak geliştirme gibi alanlar için iş kolaylaştırıyor.

Bir program üzerinde güncelleme yapmak için derlemek gerekiyor. Ancak DLL dosyası düzenlenip derlemesi her zaman daha hızlı ve kolay. Değiştirilen DLL dosyasını programın kullandığı dll dosyası ile değiştirerek kolay bir şekilde güncelleme yapabiliyoruz.

Şimdi geçelim DLL oluşturmaya;

Visual Studio 2022 veya diğer Visual Studio programlarını açıp Sınıf Kitaplığı (.NET Framework) oluşturuyoruz.


1677494202123.png


Ben bu şekilde isimlendiriyorum.

Ek olarak alt yapı kısmını .NET Framework 4.8 olarak belirledim. Siz daha düşük sürümler veya .NET 4.8.1 sürümünü kullanabilirsiniz.

1677494248206.png


Evet, DLL dosyamızın yapısı oluştu.

Burada önemli olan bazı kısımlar var.

  • Programın Class'ını Public yapmazsanız diğer programlardan erişemezsiniz.
1677494307556.png


Şimdi küçük bir matematik işlemleri yazalım.

Gördüğünüz üzere 4 işlem yapan bir Class oluşturduk.


1677495574069.png


C#:
     public class Process
    {
        public double Topla(double a, double b)
        {
            return a + b;
        }
        public double Bol(double a, double b)
        {
            return a / b;
        }
        public double Carp(double a, double b)
        {
            return a * b;
        }
        public double Cikar(double a, double b)
        {
            return a - b;
        }
    }

Şimdi bunu derlememiz lazım.
Burada dikkat edilmesi gereken kurallar var.

  • Kullanacağınız DLL dosyası eğer x64 mimari gerektiren bir program içerisinde kullanılacaksa x64 olarak derlemeniz lazım.
  • Eğer x86 bir yazılımsa x86 olarak derlemeniz gerekir.
  • Derleme modunu Debug olarak kullanabilirsiniz. Ancak programı başka insanların kullanması için yayınlayacaksanız eğer Release olarak derlemenizi öneririm.
Ben x64 ve Release olarak derledim.

1677494572040.png


Derleme yaptığın anda şöyle bir hata alacaksınız.
Bu hatanın nedeni, DLL dosyaları tek başına çalışabilen yazılımlar olmadığı için. Bu DLL dosyasının çalışabilmesi için bir *.exe dosyası lazım.

Tamam diyoruz.

1677494594181.png


Gördüğünüz üzere DLL dosyamız oluştu.

1677494649874.png


Şimdi bir Form uygulaması oluşturuyorum. Siz WPF veya UWP olarak kullanabilirsiniz.

1677494693943.png


Burada dikkat edilmesi gereken bazı durumlar var.
  • DLL dosyasını hangi .NET Framework sürümü ile derlediyseniz aynısı veya daha üstü bir sürüm olmalı program. Yoksa hata verebilir.
Gerekli ayarları yaptıktan sonra programı oluşturuyorum.

1677494710936.png


Form oluştu.

1677494777772.png


Şimdi dikkat etmeniz gerek durumlar var. Ben DLL dosyasını x64 olarak derledim. O yüzden programı x64 mimari olarak ayarlamam lazım. Yoksa hata verir.

1677494831132.png


Ardından Form'u bir defa yorumluyoruz.

1677494872576.png


Ardından oluşturduğumuz DLL dosyasını programın *.exe dosyasının oluştuğu dizine kopyalıyoruz.

1677494905607.png


Ardından sağ kısımdan, programın işleme ayarlarını yaptığımız kısımdan Başvurular > Başvuru Ekle diyoruz.

1677494947428.png


Ardından sağ alt kısımda yer alan Gözat tuşuna basıyoruz.

1677494988955.png


Oluşturduğumuz DLL dosyasını seçiyoruz ve ekle diyoruz.

1677495013752.png


Bu ekran gelecek tekrar. Tamam tuşuna basıyoruz.

1677495066737.png


Gördüğünüz üzere DLL dosyamız program çalışmak için eklendi.

1677495097894.png



Form'un tasarımı bu şekilde.
  • 2 adet TextBox.
  • 1 adet ButTon.
  • 1 adet Label.
1677495186078.png


Şimdi uygulama kısmına geçelim.

Kodumuzun üst kısmına gerekli DLL dosyasını kullanacağımızı belirtiyoruz.


1677495231166.png


C#:
using Technopat_Test_DLL;

Global alana DLL dosyamızı kullanmak için bir metota atıyoruz.

Not: Burada yazan Process metodu Threading kütüphanesi içerisindeki olan Process değil. DLL dosyamızın içerisinde oluşturduğumuz Class ismi bu.
  • Mümkünse kitaplık ile aynı isim olan Class isimleri koymayın. Yoksa çakışma hatası alabilir, ekstra kod yazmanız gerekebilir.

1677495341876.png


C#:
Process dll_islem = new Process();

Gördüğünüz üzere kodlarmız bu şekilde.

İlgili DLL dosyası içerisinde Topla() metotunu çağırıyoruz.

1677495647816.png


C#:
           private void button1_Click(object sender, EventArgs e){
            double sayi1 = Convert.ToDouble(textBox1.Text);
            double sayi2 = Convert.ToDouble(textBox2.Text);
            label1.Text = dll_islem.Topla(sayi1, sayi2).ToString();
        }

Gördüğünüz üzere program TextBox'lar üzerinden aldığı değerleri DLL dosyasına ileterek DLL dosyası işlemleri yapıp geri dönüş sağladı. Ardından Label'e yazdırdık.

1677495704318.png


Şimdi sıra geldi harici bir DLL kullanmaya.

Benim 2 ekranım var.

Şimdi bu ekranların yenileme hızlarını user32.dll ile çekelim.


C#:
        // ======================================================================================================
        // SCREEN API
        const int ENUM_CURRENT_SETTINGS = -1;
        [DllImport("user32.dll")]
        static extern bool EnumDisplaySettings(string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode);
        [StructLayout(LayoutKind.Sequential)]
        public struct DEVMODE
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
            public string dmDeviceName;
            public short dmSpecVersion;
            public short dmDriverVersion;
            public short dmSize;
            public short dmDriverExtra;
            public int dmFields;
            public int dmPositionX;
            public int dmPositionY;
            public ScreenOrientation dmDisplayOrientation;
            public int dmDisplayFixedOutput;
            public short dmColor;
            public short dmDuplex;
            public short dmYResolution;
            public short dmTTOption;
            public short dmCollate;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
            public string dmFormName;
            public short dmLogPixels;
            public int dmBitsPerPel;
            public int dmPelsWidth;
            public int dmPelsHeight;
            public int dmDisplayFlags;
            public int dmDisplayFrequency;
            public int dmICMMethod;
            public int dmICMIntent;
            public int dmMediaType;
            public int dmDitherType;
            public int dmReserved1;
            public int dmReserved2;
            public int dmPanningWidth;
            public int dmPanningHeight;
        }
        // ======================================================================================================

Burada gördüğünüz kod monitör hakkında birçok bilgiyi çekmemize yaran bir algoritma.

Form'umuzun tasarımını bu şekilde değiştirdim.

  • 1 adet ListBox.
  • 1 adet Button.

1677495993713.png


Buton kodlarımız bu şekilde;

1677496117614.png


C#:
         private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                foreach (Screen screen in Screen.AllScreens)
                {
                    // SCREEN REFRESH RATE
                    var dm = new DEVMODE { dmSize = (short)Marshal.SizeOf(typeof(DEVMODE)) };
                    EnumDisplaySettings(screen.DeviceName, ENUM_CURRENT_SETTINGS, ref dm);
                    listBox1.Items.Add(dm.dmDisplayFrequency.ToString() + " Hz");
                }
            }
            catch (Exception) { }
        }

Gördüğünüz üzere her 2 monitörümün yenileme hızını gösteriyor.

1677496157354.png



Not: Harici DLL modülleri içerisinde sınıfları kullanmayı öğrenmek tecrübe ve deneyim işidir. Zamanla kullanmayı öğrenirsiniz.

Evet, buraya kadar okuyan herkese teşekkür ederim.
Yazılım rehberlerimin devamı gelecek.

Aklınıza takılan soru olursa her zaman sorabilirsiniz.

İyi çalışmalar, kolay gelsin 😎
 
Son düzenleme:

Geri
Yukarı