(впервые опубликовано 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 и имплементируя где-то во втором(который библиотека), но повальное использование интерфейсов ведёт к другим проблемам.
Комментариев нет:
Отправить комментарий