Подключение DLL на неуправляемом коде - C#
Формулировка задачи:
Объясните, что я делаю не так? Вот у меня есть DLL файл написанный на А вот программа на C#
Мне нужно из программы получить доступ к функции из DLL библиотеки. Но при запуске программы, пишет что точка входа в DLL не найдена
C++
#if defined(__DLL__) #define DLL_EI __declspec(dllexport) #else #define DLL_EI __declspec(dllimport) #endif #include "stdafx.h" #include <stdio.h> #include <winsock2.h> // Wincosk2.h должен быть // подключен раньше windows.h! #include <windows.h> #pragma comment (lib, "Ws2_32.lib") #define MY_PORT 666 // Порт, который слушает сервер // макрос для печати количества активных // пользователей #define PRINTNUSERS if(nclients) printf("%d user on-line\n",nclients); else printf("No User on line\n"); // прототип функции, обслуживающий // подключившихся пользователей DWORD WINAPI SexToClient(LPVOID client_socket); // глобальная переменная – количество // активных пользователей int nclients = 0; static void Sv_main() { // char buff[1024]; // Буфер для различных нужд printf("TCP SERVER DEMO\n"); // Шаг 1 - Инициализация Библиотеки Сокетов // Т.к. возвращенная функцией информация // не используется ей передается указатель на // рабочий буфер, преобразуемый // к указателю на структуру WSADATA. // Такой прием позволяет сэкономить одну // переменную, однако, буфер должен быть не менее // полкилобайта размером (структура WSADATA // занимает 400 байт) if (WSAStartup(0x0202,(WSADATA *) &buff[0])) { // Ошибка! printf("Error WSAStartup %d\n", WSAGetLastError()); } // Шаг 2 - создание сокета SOCKET mysocket; // AF_INET - сокет Интернета // SOCK_STREAM - потоковый сокет (с // установкой соединения) // 0 - по умолчанию выбирается TCP протокол if ((mysocket=socket(AF_INET,SOCK_STREAM,0))<0) { // Ошибка! printf("Error socket %d\n",WSAGetLastError()); WSACleanup(); // Деиницилизация библиотеки Winsock } // Шаг 3 связывание сокета с локальным адресом sockaddr_in local_addr; local_addr.sin_family=AF_INET; local_addr.sin_port=htons(MY_PORT); // не забываем о сетевом порядке!!! local_addr.sin_addr.s_addr=0; // сервер принимает подключения // на все IP-адреса // вызываем bind для связывания if (bind(mysocket,(sockaddr *) &local_addr, sizeof(local_addr))) { // Ошибка printf("Error bind %d\n",WSAGetLastError()); closesocket(mysocket); // закрываем сокет! WSACleanup(); } // Шаг 4 ожидание подключений // размер очереди – 0x100 if (listen(mysocket, 0x100)) { // Ошибка printf("Error listen %d\n",WSAGetLastError()); closesocket(mysocket); WSACleanup(); } printf("Wait for a connection...\n"); // Шаг 5 извлекаем сообщение из очереди SOCKET client_socket; // сокет для клиента sockaddr_in client_addr; // адрес клиента // (заполняется системой) // функции accept необходимо передать размер // структуры int client_addr_size=sizeof(client_addr); // цикл извлечения запросов на подключение из // очереди while((client_socket=accept(mysocket, (sockaddr *) &client_addr, &client_addr_size))) { nclients++; // увеличиваем счетчик // подключившихся клиентов // пытаемся получить имя хоста HOSTENT *hst; hst=gethostbyaddr((char *) &client_addr.sin_addr.s_addr,4, AF_INET); // вывод сведений о клиенте printf("+%s [%s] new connect!\n", (hst)?hst->h_name:"", inet_ntoa(client_addr.sin_addr)); PRINTNUSERS // Вызов нового потока для обслужвания клиента // Да, для этого рекомендуется использовать // _beginthreadex но, поскольку никаких вызов // функций стандартной Си библиотеки поток не // делает, можно обойтись и CreateThread DWORD thID; CreateThread(NULL,NULL,SexToClient, &client_socket,NULL,&thID); } } // Эта функция создается в отдельном потоке и // обсуживает очередного подключившегося клиента // независимо от остальных DWORD WINAPI SexToClient(LPVOID client_socket) { SOCKET my_sock; my_sock=((SOCKET *) client_socket)[0]; char buff[20*1024]; #define sHELLO "Hello, Sailor\r\n" // отправляем клиенту приветствие send(my_sock,sHELLO,sizeof(sHELLO),0); // цикл эхо-сервера: прием строки от клиента и // возвращение ее клиенту int bytes_recv; while( (bytes_recv=recv(my_sock,&buff[0],sizeof(buff),0)) && (bytes_recv !=SOCKET_ERROR)) send(my_sock,&buff[0],bytes_recv,0); // если мы здесь, то произошел выход из цикла по // причине возращения функцией recv ошибки – // соединение клиентом разорвано nclients--; // уменьшаем счетчик активных клиентов printf("-disconnect\n"); PRINTNUSERS // закрываем сокет closesocket(my_sock); return 0; }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Net; using System.Net.Sockets; using System.Xml.Serialization; using System.Threading; using System.Diagnostics; using System.Net.NetworkInformation; using System.Runtime.InteropServices; namespace Server { public partial class Form1 : Form { [DllImport(@"C:/Users/Admin26/Documents/Visual Studio 2010/Projects/ServerC++/Release/Serv_dll.dll")] extern static void Sv_main(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Sv_main(); } } }
Решение задачи: «Подключение DLL на неуправляемом коде»
textual
Листинг программы
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Net; using System.Net.Sockets; using System.Xml.Serialization; using System.Threading; using System.Diagnostics; using System.Net.NetworkInformation; using System.Runtime.InteropServices; namespace Server { public partial class Form1 : Form { [DllImport(@"C:/Users/Admin26/Documents/Visual Studio 2010/Projects/ServerC++/Release/Serv_dll.dll", CharSet = CharSet.Ansi)] extern static void Sv_main(); static extern void TestString(StringBuilder str); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Thread myThread = new Thread(Sv_main); myThread.Start(); var sb = new StringBuilder(4096); TestString(sb); label1.Text = sb.ToString(); /* StringBuilder sb = new StringBuilder(4096); Somefunc(sb); string text = sb.ToString(); label1.Text = text;*/ } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д