Interoperation COM,API

Bu makalemizde managed kod içerisinden unmanaged kodlara erişim konusunu ele alacağız. Peki bu neden gerekli örneğin uygulamanız içerisinde Microsoft Excel’i runtime da kullanmanız gerekli fakat Excel kütüphanesi .NET Framework içerisinde gömülü gelmiyor. Excel’i kullanabilmeniz için Component Object Model (COM) dediğimiz modeli kullanmamız gerekir ki buna interoperation denir.

 

COM nesnelerini VS içerisinde kullanabilmek için önce Regsvr32  komutu ile register edilmelidirler. Register edildikten sonra VS ile veya Type Library Importer tool(TlbImp.exe) ile bu bileşenler import edilmeliler. 

Mevcut windowsa register edilmiş COM nesnelerini VS’da Add Reference dediğimizde COM tabının altında bulabiliriz.

 

Excelden okuma yapan kod örneği
public class InteropReader : FileReader ,IDisposable

{

    private Application oXL;

    private Workbook oWB;

    private Worksheet oSheet;

    private Range oRng;

 

    public InteropReader(string filepath)

    {

        base.FilePath = filepath;

        base.FileName = filepath;

        base.FileType = TypeConvert.StringToFileType(FileName);

    }

 

    public override DataSet Read()

    {

        switch (FileType)

        {

              case FileTypes.xls:

              case FileTypes.xlsx:

                  return ExcelRead();

              default:

                  throw new Exception("Yontem Dosya Formati Desteklenmiyor...");

          }

      }

 

  private DataSet ExcelRead()

  {

      System.Data.DataTable dt = new System.Data.DataTable("dtExcel");

      ds = new DataSet();

      ds.Tables.Add(dt);

      DataRow dr;

 

      oXL = new ApplicationClass();

      System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture;

      System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

            try

            {

                oWB = oXL.Workbooks.Open(FilePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, /*Excel.XlPlatform.xlWindows*/Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

                oSheet = (Microsoft.Office.Interop.Excel.Worksheet)oWB.Sheets[1];

 

                StringBuilder sb = new StringBuilder();

                int jValue = oSheet.UsedRange.Cells.Columns.Count;

                int iValue = oSheet.UsedRange.Cells.Rows.Count;

 

                for (int j = 1; j <= jValue; j++)

                {

                    dt.Columns.Add("column" + j, System.Type.GetType("System.String"));

                }

 

                for (int i = 1; i <= iValue; i++)

                {

                    dr = ds.Tables["dtExcel"].NewRow();

                    for (int j = 1; j <= jValue; j++)

                    {

                        oRng = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[i, j];

                        string strValue = oRng.Text.ToString();

                        dr["column" + j] = strValue;

                    }

                    ds.Tables[0].Rows.Add(dr);

                }

            }

            catch (Exception ex)

            {

                Dispose();

                throw new Exception("Excel Okunurken Bir Hata Olustu..." + ex.Message);

            }

            finally

            {

                Dispose();

 

                ds = DataObject.SetFirstRowAsColumn(ds);

 

            }

            System.Threading.Thread.CurrentThread.CurrentCulture = oldCI;

            return ds;

        }

 

        public void Dispose()

        {

            oWB.Close(Missing.Value, Missing.Value, Missing.Value);

            oXL.Workbooks.Close();

            Process[] pProcess;

            pProcess = System.Diagnostics.Process.GetProcessesByName("Excel");

            pProcess[0].Kill();

            GC.Collect();

        }

    }

 

 

COM Interoplarını kullanan .NET tool’ları aşağıdadır.
TypeLibraryImporter(TlbImp.exe) : Yeni bir .NET assembly’si import eder

TypeLibraryExporter(TlbExp.exe) : .NET uygulamaları için COM yaratır.

RegisteryEditor(Regedit.exe) : Her COM nesnesinin windows registery de bir kaydı olması gerekir.Mevcut registery entry’lerini arama ve yönetmeye yarar.

IntermediateLanguageDisassembler(Ildasm.exe) : IL’i görsel olarak görüntüler.

AssemblyRegistrationTool(Regasm.exe) : System Registration veritabanına .NET assembly’lerini eklemeye ve silmeye yarar.

 

Örneğin Bir Pdf dosyasını VS içerisinden Adobe Acrobat 7.0 Browser Document bileşenini toolboxtan sürükleyip windows formunuzda gösterebilirsiniz.

axAcroPDF1.LoadFile("abc.pdf");

axAcroPDF1.Print();

 

Mevcut COM nesneleri haricinde kendi geliştirdiğimiz bir dll’i de COM bileşeni haline çevirebiliriz.COM Callable Wrapper(CCW) .NET ile COM arasındaki öğeleri handle eden bir proxy’dir. Bunu Proje özelliklerinden Register For COM Interop checkbpxını işaretleyerek saplayabiliriz. Normal bir sınıf yazdığımızda bu sınıfın bütün öğeleri COM’da da görülür. Eğer bir sınıfın COM’da görülmesini engellemek istiyorsak o zaman COMVisible(false) niteliği o öğeye vermeliyiz.

public class ComVisiblePersonel

{

    public ComVisiblePersonel()

    {

 

    }

    [ComVisible(true)]

    public string Adi;

 

    [ComVisible(false)]

    public decimal Maas;

}

 

COM’a expose ederken şunlara dikkat etmeliyiz.

-        Bütün sınıfların parametre almaya default constructoru olmalıdır.

-        Expose edilecek tipler ve üyeler public olmalıdır.

-        Abstract sınıflar expose edilemez.

 

Expose işlemini önce uygulamayı derleyip daha sonra TlbExp.exe yi VS komut satırında çağırarak yapabiliriz.

Csc /t:library ComVisiblePersonel.cs

Bu komutu çalıştırdıktan sonra uygulamamıza bir resource dosyası eklenir. ComVisiblePersonel.res

 

Unmanaged Code kullanımı

API’nin açılımı ; Application Programming Interface (Uygulama Programlama Arayüzü)dir. API’ler bize başka sistemlerle etkileşimi sağlar.C# içine entegre olmamış bazı yapıları API’ler içerinde bulabilmemiz mümnkün. Bunu DLLImport sınıfını kullanarak yapabiliriz. using System.Runtime.InteropServices; Bu sınıf ile kullanmak istediğimiz dll ismini veriyoruz ve extern keywordu ile bu metodun dışarıdan çağrılacağını belirtiyoruz.

 

CD ROM için API kullanımı

[DllImport("winmm")]

private static extern int mciSendString(string strCommand, StringBuilder strReturn, int iReturnLenght, IntPtr hwndCallback);

void cdCikar()

{

    //cd rom sürücüsü çıkıyor

    mciSendString("Set cdaudio door open", null, 0, IntPtr.Zero);

}

 

.NET uygulamalarındaki bir tipi unmanaged bir dll deki bir tipe dönüştürmek mümkün.

Bunu aşağıdaki şekilde yapabiliriz.
public class MarshalAsDemo

{

    [MarshalAs(UnmanagedType.LPStr)]

    public String FirstName;

    [MarshalAs(UnmanagedType.Bool)]

    public Boolean IsCurrentlyWorking;

}

Yorum Yaz
Arkadaşların Burada !
Arkadaşların Burada !