Подключение 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;*/
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д