Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - Metodo non trovato
Forum - Altri Linguaggi - Metodo non trovato

Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2094
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:58
Lunedì, 08/06/2015
Ragazzi sapete dirmi perché ricevo questo errore?


C++

Codice sorgente - presumibilmente C++

  1. #include <windows.h>
  2.  
  3. extern "C" __declspec(dllexport) int __stdcall Addiziona(int a,int b);
  4.  
  5.  
  6.  
  7. int Addiziona(int a, int b )
  8. {
  9.  
  10.    int add;
  11.    __asm__  ("addl %%ebx,%%eax;"
  12.              : "=a" (add)
  13.              : "a" (a), "b" (b));
  14.  
  15.  
  16.  
  17.     return add;
  18. }




C#

Codice sorgente - presumibilmente C++

  1. [DllImport("Invoker.dll")]
  2. static extern int Addiziona(int x, int y);
  3.  
  4.  
  5. public int Prova(int a, int b)
  6.         {
  7.             return Addiziona(a, b);
  8.         }



L'errore è:

Impossibile trovare un punto di ingresso con nome 'Addiziona' nella DLL '\Invoker.dll'.

perché


PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 14:10
Lunedì, 08/06/2015
Il codice sembra corretto, magari un problema con le impostazioni di compilazione? O forse non trova il metodo per via del name mangling, ma non dovrebbe essere

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2094
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 14:39
Lunedì, 08/06/2015
proprio non saprei.
Li dice che non trova il punto di ingresso con nome Addiziona ma mi sembra strano.
perché l'ho dichiarato proprio lì sopra


PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 15:26
Lunedì, 08/06/2015
Guarda il disassemblato della DLL e trova il nome della funzione Addiziona (come generato dal compilatore).
Poi usa
Codice sorgente - presumibilmente Plain Text

  1. [DllImport("Invoker.dll", EntryPoint = "nome")]


Ho trovato tecniche simili cercando in giro, basandomi sul presupposto che non lo trovi per via del mangling

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2094
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:01
Lunedì, 08/06/2015
Ahh ecco fatto si ora funziona grazie mille lumo.
Ma come mai succede questo?


in pratica la funzione Addizione è diventata Addiziona@8



PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 19:55
Lunedì, 08/06/2015
Testo quotato

Postato originariamente da Thejuster:

Ahh ecco fatto si ora funziona grazie mille lumo.
Ma come mai succede questo?


in pratica la funzione Addizione è diventata Addiziona@8



Non ne ho idea a dire la verita', forse a C# non e' sufficiente la signature della funzione per dedurre il name mangling della funzione...

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1616
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 22:24
Lunedì, 08/06/2015
Potevi usare c++.net se non fossi riuscito

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2094
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 9:41
Giovedì, 11/06/2015
Ah non sapevo che in c++ .net si poteva usare il blocco asm...

Faccio qualche prova anche con vc++ e vediamo cosa succede


PM Quote