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

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

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

Объясните, что я делаю не так? Вот у меня есть 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;
  }
А вот программа на C#
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 библиотеки. Но при запуске программы, пишет что точка входа в DLL не найдена

Решение задачи: «Подключение 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;*/
        }
    }
}

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


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

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

14   голосов , оценка 4.214 из 5
Похожие ответы