2013-05-05 4 views
0

Я работаю над своей программой, которая мне нужна для моей работы с бакалавром (совместимость с C#/C++), и у меня проблема с отсутствующей точкой входа в моем коде ... Я пытаюсь создать просто число генератор, который будет выраженным числом в классе C++, вызывающим из C# ... Сначала я не знаю, как я передаю класс, но потом нашел способ сделать это на этой странице ... Пожалуйста, помогите мне исправить это. ..Отсутствует точка входа в моей совместимости с C#/C++

Я добавил мой код:

[C++]

#include <iostream> 
#include <cstdlib> 
#include <time.h> 

using namespace std; 


__declspec(dllexport) class Generator 
    { 
private: 
    int zaciatok; 
    int koniec; 
    int pocetprvkov; 
    int *pole; 
public: 
     Generator(){} 


     void Vytvor (int zaciatok, int koniec, int pocetprvkov) 
    { 
     srand((unsigned)time(0)); 
     pole= new int [pocetprvkov]; 
    } 

     void Napln() 
    { 
     for(int a=0; a<pocetprvkov; a++) 
      { 
       pole[a] = rand() % (koniec - zaciatok +1) + zaciatok; 
     } 
    } 
     void Vypis() 
    { 
     for(int a=0; a<pocetprvkov; a++) 
     cout << pole[a] << endl; 
    } 

     ~Generator() 
     { 
      delete[] pole; 
      pole= 0; 
     } 

    }; 

extern "C" 
{ 
__declspec(dllexport) Generator* Vytvor_Triedu() { return new Generator(); } 
__declspec(dllexport) void Vytvor(Generator* prva) {prva->Vytvor(5,25,4); } 
__declspec(dllexport) void Napln(Generator* prva) {prva->Napln(); } 
__declspec(dllexport) void Vypis(Generator* prva) {prva->Vypis(); } 
__declspec(dllexport) void Vymaz(Generator* prva) { delete prva; } 
} 

[C#]

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.InteropServices; 

namespace GeneratorCsharp 
{ 
    class Program 
    { 
     [DllImport("DllTriedaGenerator.dll", CallingConvention = CallingConvention.Cdecl)] 
     public static extern IntPtr Vytvor_Triedu(); 

     [DllImport("DllTriedaGenerator.dll", CallingConvention = CallingConvention.Cdecl)] 
     public static extern void Vytvor(IntPtr value); 

     [DllImport("DllTriedaGenerator.dll", CallingConvention = CallingConvention.Cdecl)] 
     public static extern void Napln(IntPtr value); 

     [DllImport("DllTriedaGenerator.dll", CallingConvention = CallingConvention.Cdecl)] 
     public static extern void Vypis(IntPtr value); 

     [DllImport("DllTriedaGenerator.dll", CallingConvention = CallingConvention.Cdecl)] 
     public static extern void Vymaz(IntPtr value); 

     static void Main(string[] args) 
     { 
      IntPtr trieda = Vytvor_Triedu(); 
      Vytvor(trieda); 
      Napln(trieda); 
      Vypis(trieda); 
      Vymaz(trieda); 


     } 
    }; 
} 

Большое спасибо!

+0

Не могли бы вы высказать полную ошибку во время компиляции или времени выполнения? – Jiwan

+0

Необработанное исключение типа «System.EntryPointNotFoundException» произошло в GeneratorCsharp.exe Дополнительная информация: Не удалось найти точку входа с именем «Vytvor_Triedu» в DLL «DllTriedaGenerator.dll». – user2351803

ответ

0

Ну, вы должны использовать dumpbin, найти измененное имя вашей функции, а затем добавить EntryPoint = "yourMangledName" в свой атрибут DllImport.

+0

Является ли какой-либо другой способ найти искаженное имя моей функции, потому что когда я пытаюсь открыть диспетчер системы dumpbin dispay – user2351803

+0

Любой портативный выносливый самосвал. Как PE explorer, ollydbg, IDA, ... – Jiwan

+0

Я установил PE explorer, откройте там свою DLL, но он покажет мне только адрес точки входа, а не имя ... Я в отчаянии – user2351803