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

 
+
-
edit
 

anybody

координатор

админ. бан
По итогам обсуждения "C#: Как осуществить "import" определений и т.п.?" (http://balancer.ru/tech/forum/viewtopic.php?id=63939)


Памятка начинающему программисту на C# .NET :)

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

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

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

$ cygcheck -c
code text
  1. Cygwin Package Information
  2. Package              Version            Status
  3. _update-info-dir     00757-1            OK
  4. alternatives         1.3.30c-2          OK
  5. antiword             0.37-1             OK
  6. ash                  20040127-4         OK
  7. astyle               1.22-1             OK
  8. atk                  1.10.3-1           OK
  9. atk-runtime          1.10.3-1           OK
  10. base-files           3.7-1              OK
  11. base-passwd          2.2-1              OK
  12. bash                 3.2.39-20          OK
  13. binutils             20080624-2         OK
  14. bison                2.3-1              OK
  15. bzip2                1.0.5-2            OK
  16. compface             1.5.2-1            OK
  17. coreutils            6.10-1             OK
  18. crypt                1.1-1              OK
  19. csih                 0.1.8-1            OK
  20. cygrunsrv            1.34-1             OK
  21. cygutils             1.3.2-1            OK
  22. cygwin               1.5.25-15          OK
  23. cygwin-doc           1.4-4              OK
  24. dejagnu              20021217-2         OK
  25. diffutils            2.8.7-1            OK
  26. e2fsprogs            1.35-3             OK
  27. editrights           1.01-2             OK
  28. emacs                21.2-13            OK
  29. emacs-el             21.2-13            OK
  30. emacs-X11            21.2-13            OK
  31. expat                2.0.1-1            OK
  32. expect               20030128-1         OK
  33. file                 4.21-1             OK
  34. findutils            4.4.0-3            OK
  35. flawfinder           1.27-1             OK
  36. flex                 2.5.35-1           OK
  37. flip                 1.19-1             OK
  38. fontconfig           2.4.1-5            OK
  39. gawk                 3.1.6-1            OK
  40. gcc                  3.4.4-3            OK
  41. gcc-ada              3.4.4-3            OK
  42. gcc-core             3.4.4-3            OK
  43. gcc-g++              3.4.4-3            OK
  44. gcc-gpc              3.4.4-3            OK
  45. gcc-java             3.4.4-3            OK
  46. gcc-mingw            20040810-1         OK
  47. gcc-mingw-ada        20050522-1         OK
  48. gcc-mingw-core       20050522-1         OK
  49. gcc-mingw-g++        20050522-1         OK
  50. gcc-mingw-gpc        20040810-1         OK
  51. gcc-mingw-java       20050522-1         OK
  52. gcc-testsuite        3.4.4-3            OK
  53. gettext              0.15-1             OK
  54. glib                 1.2.10-3           OK
  55. glib2                2.10.3-1           OK
  56. glib2-runtime        2.10.3-1           OK
  57. gmp                  4.2.3-1            OK
  58. grep                 2.5.1a-4           OK
  59. groff                1.19.2-2           OK
  60. gtk+                 1.2.10-2           OK
  61. gtk2-x11             2.6.10-1           OK
  62. gtk2-x11-runtime     2.6.10-1           OK
  63. guile                1.8.2-1            OK
  64. gvim                 7.2-1              OK
  65. gzip                 1.3.12-2           OK
  66. httping              1.2.5-1            OK
  67. indent               2.2.9-2            OK
  68. less                 382-1              OK
  69. lesstif              0.94.4-1           OK
  70. lftp                 3.7.3-2            OK
  71. libbz2_1             1.0.5-2            OK
  72. libdb4.2             4.2.52.5-2         OK
  73. libdb4.5             4.5.20.2-2         OK
  74. libecpg5             8.2.9-1            OK
  75. libexpat0            1.95.8-2           OK
  76. libexpat1            2.0.1-1            OK
  77. libexpat1-devel      2.0.1-1            OK
  78. libfontconfig1       2.4.1-5            OK
  79. libfreetype26        2.3.7-1            OK
  80. libgdbm4             1.8.3-8            OK
  81. libglade2            2.5.1-1            OK
  82. libgmp3              4.2.3-1            OK
  83. libguile12           1.6.7-4            OK
  84. libguile17           1.8.2-1            OK
  85. libiconv2            1.11-1             OK
  86. libintl1             0.10.40-1          OK
  87. libintl2             0.12.1-3           OK
  88. libintl3             0.14.5-1           OK
  89. libintl8             0.15-1             OK
  90. libjpeg62            6b-12              OK
  91. libltdl3             1.5.27a-1          OK
  92. libncurses-devel     5.5-3              OK
  93. libncurses7          5.3-4              OK
  94. libncurses8          5.5-3              OK
  95. libopenldap2_3_0     2.3.43-1           OK
  96. libpcre0             7.8-1              OK
  97. libpgtypes2          8.2.9-1            OK
  98. libpng12             1.2.12-1           OK
  99. libpopt0             1.6.4-4            OK
  100. libpq4               8.2.5-1            OK
  101. libpq5               8.2.9-1            OK
  102. libreadline6         5.2.12-10          OK
  103. libsasl2             2.1.19-3           OK
  104. libtiff4             3.6.0-5            OK
  105. libtiff5             3.8.2-3            OK
  106. libungif4            4.1.4-1            OK
  107. libwrap0             7.6-4              OK
  108. libXaw3d7            1.5D-7             OK
  109. libXft               2.1.7-2            OK
  110. libXft1              1.0.0-1            OK
  111. libXft2              2.1.7-2            OK
  112. libxml2              2.6.32-2           OK
  113. login                1.9-8              OK
  114. m4                   1.4.10b-2          OK
  115. make                 3.81-2             OK
  116. man                  1.6e-1             OK
  117. mingw-runtime        3.15-1             OK
  118. minires              1.01-1             OK
  119. ncftp                3.2.1-1            OK
  120. Numeric              24.2-1             OK
  121. openssh              5.1p1-3            OK
  122. openssl              0.9.8h-1           OK
  123. optipng              0.5.5-1            OK
  124. pango                1.8.1-1            OK
  125. pango-runtime        1.8.1-1            OK
  126. par                  1.52-1             OK
  127. pcre                 7.8-1              OK
  128. postgresql           8.2.9-1            OK
  129. postgresql-client    8.2.9-1            OK
  130. pwgen                2.06-2             OK
  131. pygtk2               2.6.3-1            OK
  132. python               2.5.1-2            OK
  133. python-crypto        2.0.1-1            OK
  134. readline             5.2.12-10          OK
  135. rebase               2.4.4-1            OK
  136. ruby                 1.8.7-p72-1        OK
  137. run                  1.1.10-1           OK
  138. sed                  4.1.5-2            OK
  139. t1lib5               5.1.2-1            OK
  140. tar                  1.20-1             OK
  141. tcltk                20080420-1         OK
  142. termcap              20050421-1         OK
  143. terminfo             5.5_20061104-1     OK
  144. texinfo              4.8a-1             OK
  145. tidy                 041206-1           OK
  146. tzcode               2008a-1            OK
  147. unzip                5.52-2             OK
  148. vim                  7.2-1              OK
  149. w32api               3.12-1             OK
  150. webcheck             1.10.1-1           OK
  151. wget                 1.11.3-1           OK
  152. which                2.19-1             OK
  153. wput                 0.6.1-2            OK
  154. X-startup-scripts    1.0.11-1           OK
  155. xemacs               21.4.21-1          OK
  156. xemacs-emacs-common  21.4.21-1          OK
  157. xemacs-mule-sumo     2007-04-27-1       OK
  158. xemacs-sumo          2007-04-27-1       OK
  159. xemacs-tags          21.4.21-1          OK
  160. xorg-x11-base        6.8.99.901-1       OK
  161. xorg-x11-bin         6.8.99.901-1       OK
  162. xorg-x11-bin-dlls    6.8.99.901-1       OK
  163. xorg-x11-bin-lndir   6.8.99.901-1       OK
  164. xorg-x11-etc         6.8.99.901-1       OK
  165. xorg-x11-fenc        6.8.99.901-1       OK
  166. xorg-x11-fnts        6.8.99.901-1       OK
  167. xorg-x11-libs-data   6.8.99.901-1       OK
  168. xorg-x11-xwin        6.8.99.901-1       OK
  169. xpdf                 3.02-1             OK
  170. xterm                229-1              OK
  171. zip                  2.32-2             OK
  172. zlib                 1.2.3-2            OK
 3.0.33.0.3
Это сообщение редактировалось 02.10.2008 в 16:54
+
-
edit
 

anybody

координатор

админ. бан
Сначала приведу Makefile:
code text
  1. CS=cscc
  2. AL=al
  3. AL_DLL_FORMAT=-d
  4.  
  5. probe.exe : probe.cs hello.dll
  6.         ${CS} -o probe.exe probe.cs
  7.  
  8. hello.dll : hello.exe
  9.         ${AL} ${AL_DLL_FORMAT} -o hello.dll hello.exe
  10.  
  11. hello.exe : hello.cs
  12.         ${CS} -o hello.exe hello.cs



Теперь напишем файл hello.cs:
code text
  1. class Hello
  2. {
  3.     private System.String msg;
  4.  
  5.     public static void Main()
  6.     {
  7.         System.Console.WriteLine("Hello!");
  8.     }
  9.  
  10.     public void set_message(System.String message)
  11.     {
  12.         msg = message;
  13.     }
  14.  
  15.     public System.String get_message()
  16.     {
  17.         return msg;
  18.     }
  19. }



И, наконец, probe.cs:
code text
  1. class Probe
  2. {
  3.     static void Main()
  4.     {
  5.         // Declare variables
  6.         System.Reflection.Assembly a;
  7.         System.Object h;
  8.         System.Type t;
  9.         System.Reflection.MethodInfo mi;
  10.         System.Object[] p;
  11.         System.Object s;
  12.  
  13.         // Initialise variables
  14.         a = System.Reflection.Assembly.Load("hello");
  15.         h = a.CreateInstance("Hello");
  16.         t = a.GetType("Hello");
  17.  
  18.         // Working
  19.         mi = t.GetMethod("Main");
  20.         p = null;
  21.         s = mi.Invoke(h, p);
  22.  
  23.         mi = t.GetMethod("set_message");
  24.         p = new System.Object[1];
  25.         p[0] = "Assembly!";
  26.         mi.Invoke(h, p);
  27.  
  28.         mi = t.GetMethod("get_message");
  29.         p = null;
  30.         s = mi.Invoke(h, p);
  31.  
  32.         System.Console.WriteLine(s.ToString());
  33.     }
  34. }


Итог:
code text
  1. $ make probe.cs
  2.  
  3. cscc -o hello.exe hello.cs
  4. al -d -o hello.dll hello.exe
  5. cscc -o probe.exe probe.cs
  6.  
  7. $ ilrun probe.exe
  8.  
  9. Hello!
  10. 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 и имплементируя где-то во втором(который библиотека), но повальное использование интерфейсов ведёт к другим проблемам.
 
 3.0.33.0.3
+
-
edit
 

anybody

координатор

админ. бан
Надеюсь, Рома не будет возражать. :)

Я продублировал публикацию этой "памятки" у себя на сайте в блоге: Блог Василия Ерёменко: Пример использования .NET Assembly при помощи C#

Обновление от 2011-04-08: Ссылка на статью сменилась.
 3.0.63.0.6
Это сообщение редактировалось 08.04.2011 в 01:47
+
-
edit
 

Balancer

администратор
★★★★★
anybody> Надеюсь, Рома не будет возражать. :)

Я - нет. Хотя тут авторство уже не моё :)

...

Всё не соберусь написать предупреждение при ответе, что вся размещённая на форуме авторами информация рассматривается по GPL :)
 
+
-
edit
 

anybody

координатор

админ. бан
Balancer> Я - нет. Хотя тут авторство уже не моё :)

Это приятно. :) Спасибо. :)

Balancer> Всё не соберусь написать предупреждение при ответе, что вся размещённая на форуме авторами информация рассматривается по GPL :)

Я сразу на сайте внизу каждой страницы, по образу и подобию Wikipedia, сделал приписку: "All information is available under the terms of the GNU Free Documentation License". Ну и копирайты всякие... :) Кстати, сейчас глянул: заметки о правах на использование отсутствуют в печатных версиях. Надо будет исправить. :)
 3.0.43.0.4

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru