Подключение DLL на неуправляемом коде - C#

Узнай цену своей работы

Формулировка задачи:

Объясните, что я делаю не так? Вот у меня есть DLL файл написанный на

C++

Листинг программы
  1. #if defined(__DLL__)
  2. #define DLL_EI __declspec(dllexport)
  3. #else
  4. #define DLL_EI __declspec(dllimport)
  5. #endif
  6. #include "stdafx.h"
  7. #include <stdio.h>
  8. #include <winsock2.h> // Wincosk2.h должен быть
  9. // подключен раньше windows.h!
  10. #include <windows.h>
  11. #pragma comment (lib, "Ws2_32.lib")
  12.  
  13. #define MY_PORT 666
  14. // Порт, который слушает сервер
  15. // макрос для печати количества активных
  16. // пользователей
  17. #define PRINTNUSERS if(nclients) printf("%d user on-line\n",nclients); else printf("No User on line\n");
  18. // прототип функции, обслуживающий
  19. // подключившихся пользователей
  20. DWORD WINAPI SexToClient(LPVOID client_socket);
  21.  
  22. // глобальная переменная – количество
  23. // активных пользователей
  24. int nclients = 0;
  25.  
  26. static void Sv_main()
  27. {
  28. //
  29. char buff[1024]; // Буфер для различных нужд
  30. printf("TCP SERVER DEMO\n");
  31. // Шаг 1 - Инициализация Библиотеки Сокетов
  32. // Т.к. возвращенная функцией информация
  33. // не используется ей передается указатель на
  34. // рабочий буфер, преобразуемый
  35. // к указателю на структуру WSADATA.
  36. // Такой прием позволяет сэкономить одну
  37. // переменную, однако, буфер должен быть не менее
  38. // полкилобайта размером (структура WSADATA
  39. // занимает 400 байт)
  40. if (WSAStartup(0x0202,(WSADATA *) &buff[0]))
  41. {
  42. // Ошибка!
  43. printf("Error WSAStartup %d\n",
  44. WSAGetLastError());
  45. }
  46. // Шаг 2 - создание сокета
  47. SOCKET mysocket;
  48. // AF_INET - сокет Интернета
  49. // SOCK_STREAM - потоковый сокет (с
  50. // установкой соединения)
  51. // 0 - по умолчанию выбирается TCP протокол
  52. if ((mysocket=socket(AF_INET,SOCK_STREAM,0))<0)
  53. {
  54. // Ошибка!
  55. printf("Error socket %d\n",WSAGetLastError());
  56. WSACleanup();
  57. // Деиницилизация библиотеки Winsock
  58. }
  59. // Шаг 3 связывание сокета с локальным адресом
  60. sockaddr_in local_addr;
  61. local_addr.sin_family=AF_INET;
  62. local_addr.sin_port=htons(MY_PORT);
  63. // не забываем о сетевом порядке!!!
  64. local_addr.sin_addr.s_addr=0;
  65. // сервер принимает подключения
  66. // на все IP-адреса
  67. // вызываем bind для связывания
  68. if (bind(mysocket,(sockaddr *) &local_addr,
  69. sizeof(local_addr)))
  70. {
  71. // Ошибка
  72. printf("Error bind %d\n",WSAGetLastError());
  73. closesocket(mysocket); // закрываем сокет!
  74. WSACleanup();
  75. }
  76. // Шаг 4 ожидание подключений
  77. // размер очереди – 0x100
  78. if (listen(mysocket, 0x100))
  79. {
  80. // Ошибка
  81. printf("Error listen %d\n",WSAGetLastError());
  82. closesocket(mysocket);
  83. WSACleanup();
  84. }
  85. printf("Wait for a connection...\n");
  86. // Шаг 5 извлекаем сообщение из очереди
  87. SOCKET client_socket; // сокет для клиента
  88. sockaddr_in client_addr; // адрес клиента
  89. // (заполняется системой)
  90. // функции accept необходимо передать размер
  91. // структуры
  92. int client_addr_size=sizeof(client_addr);
  93. // цикл извлечения запросов на подключение из
  94. // очереди
  95. while((client_socket=accept(mysocket, (sockaddr *)
  96. &client_addr, &client_addr_size)))
  97. {
  98. nclients++; // увеличиваем счетчик
  99. // подключившихся клиентов
  100. // пытаемся получить имя хоста
  101. HOSTENT *hst;
  102. hst=gethostbyaddr((char *)
  103. &client_addr.sin_addr.s_addr,4, AF_INET);
  104. // вывод сведений о клиенте
  105. printf("+%s [%s] new connect!\n",
  106. (hst)?hst->h_name:"",
  107. inet_ntoa(client_addr.sin_addr));
  108. PRINTNUSERS
  109. // Вызов нового потока для обслужвания клиента
  110. // Да, для этого рекомендуется использовать
  111. // _beginthreadex но, поскольку никаких вызов
  112. // функций стандартной Си библиотеки поток не
  113. // делает, можно обойтись и CreateThread
  114. DWORD thID;
  115. CreateThread(NULL,NULL,SexToClient,
  116. &client_socket,NULL,&thID);
  117. }
  118. }
  119. // Эта функция создается в отдельном потоке и
  120. // обсуживает очередного подключившегося клиента
  121. // независимо от остальных
  122. DWORD WINAPI SexToClient(LPVOID client_socket)
  123. {
  124. SOCKET my_sock;
  125. my_sock=((SOCKET *) client_socket)[0];
  126. char buff[20*1024];
  127. #define sHELLO "Hello, Sailor\r\n"
  128. // отправляем клиенту приветствие
  129. send(my_sock,sHELLO,sizeof(sHELLO),0);
  130. // цикл эхо-сервера: прием строки от клиента и
  131. // возвращение ее клиенту
  132. int bytes_recv;
  133. while( (bytes_recv=recv(my_sock,&buff[0],sizeof(buff),0)) && (bytes_recv !=SOCKET_ERROR))
  134. send(my_sock,&buff[0],bytes_recv,0);
  135. // если мы здесь, то произошел выход из цикла по
  136. // причине возращения функцией recv ошибки –
  137. // соединение клиентом разорвано
  138. nclients--; // уменьшаем счетчик активных клиентов
  139. printf("-disconnect\n"); PRINTNUSERS
  140. // закрываем сокет
  141. closesocket(my_sock);
  142. return 0;
  143. }
А вот программа на C#
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.IO;
  9. using System.Net;
  10. using System.Net.Sockets;
  11. using System.Xml.Serialization;
  12. using System.Threading;
  13. using System.Diagnostics;
  14. using System.Net.NetworkInformation;
  15. using System.Runtime.InteropServices;
  16. namespace Server
  17. {
  18. public partial class Form1 : Form
  19. {
  20. [DllImport(@"C:/Users/Admin26/Documents/Visual Studio 2010/Projects/ServerC++/Release/Serv_dll.dll")]
  21. extern static void Sv_main();
  22. public Form1()
  23. {
  24. InitializeComponent();
  25. }
  26.  
  27. private void button1_Click(object sender, EventArgs e)
  28. {
  29. Sv_main();
  30. }
  31. }
  32. }
Мне нужно из программы получить доступ к функции из DLL библиотеки. Но при запуске программы, пишет что точка входа в DLL не найдена

Решение задачи: «Подключение DLL на неуправляемом коде»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.IO;
  9. using System.Net;
  10. using System.Net.Sockets;
  11. using System.Xml.Serialization;
  12. using System.Threading;
  13. using System.Diagnostics;
  14. using System.Net.NetworkInformation;
  15. using System.Runtime.InteropServices;
  16.  
  17. namespace Server
  18. {
  19.     public partial class Form1 : Form
  20.     {
  21.         [DllImport(@"C:/Users/Admin26/Documents/Visual Studio 2010/Projects/ServerC++/Release/Serv_dll.dll", CharSet = CharSet.Ansi)]
  22.         extern static void Sv_main();
  23.         static extern void TestString(StringBuilder str);
  24.         public Form1()
  25.         {
  26.             InitializeComponent();
  27.         }
  28.  
  29.         private void button1_Click(object sender, EventArgs e)
  30.         {
  31.             Thread myThread = new Thread(Sv_main);
  32.             myThread.Start();
  33.  
  34.             var sb = new StringBuilder(4096);
  35.             TestString(sb);
  36.             label1.Text = sb.ToString();
  37.             /*
  38.             StringBuilder sb = new StringBuilder(4096);
  39.             Somefunc(sb);
  40.             string text = sb.ToString();
  41.             label1.Text = text;*/
  42.         }
  43.     }
  44. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.214 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы