2009-02-19

Пример использования .NET Assembly при помощи C#

(впервые опубликовано 02 октября 2008 г. мною на Форумах Баланцер'а в разделе Программирование в ветке Пример использования .NET Assembly при помощи C#)

Предварительные замечания


Данный пример создан на одной машине. Переносимость пока не проверялась. Машина: Intel Celeron 430 @ 1.80GHz, 996Mb of RAM, Physical Address Extension, M$ Windows XP Professional version 2002 Service Pack 2, Cygwin, с сайта http://dotgnu.org взяты и установлены файлы treecc-0.3.10.tar.gz, pnet-0.8.0.tar.gz, pnetlib-0.8.0.tar.gz, никакие особые настройки в ходе конфигурации, компиляции и установки не указывались.

Сначала приведу Makefile:



CS=cscc
AL=al
AL_DLL_FORMAT=-d

probe.exe : probe.cs hello.dll
    ${CS} -o probe.exe probe.cs

hello.dll : hello.exe
    ${AL} ${AL_DLL_FORMAT} -o hello.dll hello.exe

hello.exe : hello.cs
    ${CS} -o hello.exe hello.cs

Теперь напишем файл hello.cs:



class Hello
{
    private System.String msg;

    public static void Main()
    {
        System.Console.WriteLine("Hello!");
    }

    public void set_message(System.String message)
    {
        msg = message;
    }

    public System.String get_message()
    {
        return msg;
    }
}

И, наконец, probe.cs:



class Probe
{
    static void Main()
    {
        // Declare variables
        System.Reflection.Assembly a;
        System.Object h;
        System.Type t;
        System.Reflection.MethodInfo mi;
        System.Object[] p;
        System.Object s;

        // Initialise variables
        a = System.Reflection.Assembly.Load("hello");
        h = a.CreateInstance("Hello");
        t = a.GetType("Hello");

        // Working
        mi = t.GetMethod("Main");
        p = null;
        s = mi.Invoke(h, p);

        mi = t.GetMethod("set_message");
        p = new System.Object[1];
        p[0] = "Assembly!";
        mi.Invoke(h, p);

        mi = t.GetMethod("get_message");
        p = null;
        s = mi.Invoke(h, p);

        System.Console.WriteLine(s.ToString());
    }
}

Итог:



$ make probe.cs

cscc -o hello.exe hello.cs
al -d -o hello.dll hello.exe
cscc -o probe.exe probe.cs

$ ilrun probe.exe

Hello!
Assembly!

Что и требовалось! :)

Мой вывод


.NET Assembly в рамках C# удобно использовать для "вынесения" в отдельные пакеты (assemblies) сложных и многострочных участков программ, имеющих понятный и сравнительно простой интерфейс. Для создания модулей в стиле Python assembly слишком громоздки. Наиболее точно схему "эмуляции модульности" отразил Tico (см. ветку C#: Как осуществить "import" определений и т.п.? http://balancer.ru/tech/forum/viewtopic.php?id=63939, второе высказывание http://balancer.ru/2008/09/22/post-1675536.html)
Tico: В принципе, подобие модульности можно обеспечить с помощью интерфейсов, определяя их в третьем assembly и имплементируя где-то во втором(который библиотека), но повальное использование интерфейсов ведёт к другим проблемам.

Комментариев нет:

Отправить комментарий