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;

}

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

No comments yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s