Подключение 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;*/
}
}
}