пятница, 16 июля 2010 г.

Вызываем C код из C#

Не найдя устраивающей меня библиотеки для C# для работы с матрицами (уровня libgsl) нашел простой способ вызова C кода из C#. Делается все элементарно.  Есть такая штука, как System.Runtime.InteropServices. А в ней объявлен атрибут DllImport. Вот, что пишет MSDN:

"Атрибут DllImportAttribute предоставляет сведения, необходимые для вызова функции, экспортированной из неуправляемой динамической библиотеки (DLL).Минимальным требованием является указание имени динамической библиотеки (DLL), содержащей точку входа."

А вот и пример привязки к gsl. Класс Matrix. Умеет только создаваться и метод для доступа к матрице.

using System;
using System.Runtime.InteropServices;
namespace test
{
   
    class GslMatrix
    {
        [DllImport("libgsl.dll")]
        static extern IntPtr gsl_matrix_alloc(int n1,int n2);
        [DllImport("libgsl.dll")]
        static extern double gsl_matrix_get(IntPtr m,int i,int j);
        [DllImport("libgsl.dll")]
        static extern double gsl_matrix_set(IntPtr m,int i,int j,double v);
       
        private IntPtr data;
        public  int Rows {get;set;}
        public  int Cols {get;set;}
        public GslMatrix(int rows,int cols){
            data=gsl_matrix_alloc(rows,cols);
            Cols=cols;
            Rows=rows;
        }
        public double this[int i,int j]{
            get{
                return gsl_matrix_get(data,i,j);
            }
            set{
                gsl_matrix_set(data,i,j,value);
            }
        }
        public override string ToString ()
        {
            string result="";
            for(int i=0;i
                for(int j=0;j
                    result+=string.Format("{0} ",this[i,j]);
                result+="\n";
            }
            return result;
        }
    }
    class MainClass
    {       
        public static void Main (string[] args)
        {
            var mtr=new GslMatrix(2,2);
            mtr[0,0]=1;mtr[0,1]=1;
            mtr[1,0]=2;mtr[0,0]=2;
            Console.WriteLine(mtr.ToString());
        }
    }
}

2 комментария:

  1. А все привязки к GSL придется руками писать?

    ОтветитьУдалить
  2. Видимо да. Я не нашел привязки к нему. Да и вменяемой и живой замены я тоже не нашел.

    ОтветитьУдалить