Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

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
publicclassInteropReader : 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);

    }

 

    publicoverride DataSet Read()

    {

        switch (FileType)

        {

              case FileTypes.xls:

              case FileTypes.xlsx:

                  return ExcelRead();

              default:

                  thrownewException(“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 = newStringBuilder();

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

                thrownewException(“Excel Okunurken Bir Hata Olustu…” + ex.Message);

            }

            finally

            {

                Dispose();

 

                ds = DataObject.SetFirstRowAsColumn(ds);

 

            }

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

            return ds;

        }

 

        publicvoid 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.

publicclassComVisiblePersonel

{

public ComVisiblePersonel()

    {

 

    }

    [ComVisible(true)]

    publicstring Adi;

 

    [ComVisible(false)]

    publicdecimal 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”)]

privatestaticexternint 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.
publicclassMarshalAsDemo

{

    [MarshalAs(UnmanagedType.LPStr)]

    publicString FirstName;

    [MarshalAs(UnmanagedType.Bool)]

    publicBoolean IsCurrentlyWorking;

}

Reklamlar

Temmuz 13, 2010 - Posted by | C# | , , , ,

Henüz yorum yapılmamış.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s