Mr Burns Skrevet 12. april 2007 Del Skrevet 12. april 2007 Dette virket for litt siden, men så ble .cpp-fila overskrevet med det som sto i .h-fila, og da ble det bare tull... Jeg lager en dll i managed C++ i VS2005. .h-fil: namespace DetectorInterface { public ref class DetInt { public: __declspec(dllexport) bool tull(); }; } .cpp-fil: namespace DetectorInterface { public ref class DetInt { bool tull() { return false; } }; } I C#-programmet har jeg lagt til dllen, og brukt using DetectorInterface ; Da kan jeg gjøre DetInt detector = new DetInt();. Alt såre vel hittil. Men jeg finner ikke funksjonen som er definert. Fikk det til for litt siden, men husker ikke hva det sto i filene... Lenke til kommentar
GeirGrusom Skrevet 12. april 2007 Del Skrevet 12. april 2007 bool DetectorInterface::DetInt::tull() { return false; } Du trenger ikke __declspec(dllexport) i Managed C++, heller ikke ref. Lenke til kommentar
Mr Burns Skrevet 13. april 2007 Forfatter Del Skrevet 13. april 2007 (endret) OK, prøver på nytt... Her er en .h-fil fra et c++ class library prosjekt. // DLLTest.h #pragma once using namespace System; namespace DLLTest { public ref class MostlyHarmless { public: int DLLTest::MostlyHarmless::LifeUniverseAndEverything() { return 42; } }; } (Jeg har ikke noe i .cpp- filen) Funker som bare det! Takker og bukker! Men så kommer en liten utfordring, jeg skal returnere et bilde fra en av funksjonene. Eller en array, hvis det er enklere... int* getImage() { int *arr = new int[7744]; // Gjøre ting her... return arr; Hvordan håndterer jeg det i c#-programmet? Endret 13. april 2007 av Mr Burns Lenke til kommentar
wolf5 Skrevet 17. april 2007 Del Skrevet 17. april 2007 Dersom du får en byte array i retur til C#, så kan du vel dytte den inn i et Image/Bitmap objekt via Stream (MemoryStream ms = new MemoryStream(byte[])) Lenke til kommentar
GeirGrusom Skrevet 17. april 2007 Del Skrevet 17. april 2007 ? Problemet er at fuksjonene ikke listes i IntelliSense i Visual Studio, husker jeg køddet med dette jeg også, men desverre husker jeg ikke hvordan det løses. Men du kan prøve å skrive __gc foran, det tvinger funksjonen/klassen til å bli en managed klasse. Lenke til kommentar
Mr Burns Skrevet 18. april 2007 Forfatter Del Skrevet 18. april 2007 Vet ikke helt hva problemet var, det funker i hvert fall nå. Jeg jobber mot en unmanaged dll, som jeg bare har en .h-fil til. Problemet var at jeg ikke fikk laget funksjonene mine riktig, så de kom ikke opp i VS. Jeg returnerer en int * til c#. JEg vet hvor mange byte det er i den arrayen, så jeg leser de ut vha unsafe, trengte ikke noe stream. Her er litt kode fra min .h-fil, har ikke noe i .cpp-fila: int* getImage() { int *arr = new int[7744]; image = GetImage(ctr); return (int*)image->data; } image er en struct som bla inneholder bildedata, som en array. Her litt kode som bruker min .dll. unsafe { int* imagePtr; int[,] image = new int[88, 88]; imagePtr = detector.getImage(); image = arrayTo2DArray(imagePtr); } Alt i alt var det ikke så innvikla allikevel ;-) Lenke til kommentar
Mr Burns Skrevet 7. juni 2007 Forfatter Del Skrevet 7. juni 2007 (endret) Av forskjellige grunner som jeg ikke forstår, virker ikke dette som planlagt Jeg får fileLoadException når jeg prøver å laste inn DLLen. Jeg prøver da å bruke den ved å legge den til som en reference. Nå vil jeg prøve å laste inn hver enkelt funkson ved hjelp av DllImport. Koden til DLLen står nedenfor. Problemet med dette er at jeg får feilen "Unable to find an entry point named 'initDetector' in DLL 'C:\Projects\DetectorInterface\debug\DetectorInterface.dll'." når jeg kjører programmet. Jeg har kikket igjennom Dllen ved hjelp av dumpbin, men der finner jeg ikke f,eks initDetector() I DET HELE TATT! Hvordan kan jeg forsikre meg om at funksjonene blir eksportert riktig? Eventuelt, hvordan kan jeg finne dem? // DetectorInterface.h #include "C:\\Program Files\\DIC\\SDK\\include\\diclib_dll.h" #pragma once using namespace System; TAjatDICControl *ctr; TDICLibImageInformation * image; namespace DetectorInterface { public ref class DetInt { public: DetInt::DetInt() { // Default constructor? } int DetInt::initDetector() { // Klippe... } int DetInt::closeDetector() { // Klippe... } int* DetInt::getImage() { // Klippe... } } } C# kode for funksjonsinnhenting: [DllImport("C:\\Projects\\DetectorInterface\\debug\\DetectorInterface.dll")] static extern int initDetector(); [DllImport("detectorInterface.dll")] static extern int closeDetector(); [DllImport("detectorInterface.dll")] static extern int* getImage(int exposureTime); Endret 7. juni 2007 av Mr Burns Lenke til kommentar
GeirGrusom Skrevet 7. juni 2007 Del Skrevet 7. juni 2007 Grunnen til at du ikke finner den i dll-filen, er fordi dette er en managed Dll, men Managed C++ klasser/funksjoner __declspec(dllexport) kan brueks for å eksportere rene C funksjoner hverken C++ eller .NET er tilatt for funksjoner som skal brukes av DllImport i .NET Du kan bare bruke disse klassene i ditt .NET hvis de er deklarert public, og du inkluderer dem som referense enten direkte, eller ved å bruke System.Reflecyion.Assembly.Load for delayed loading av dll-en. Lenke til kommentar
Mr Burns Skrevet 7. juni 2007 Forfatter Del Skrevet 7. juni 2007 Du kan bare bruke disse klassene i ditt .NET hvis de er deklarert public, og du inkluderer dem som referense enten direkte, eller ved å bruke System.Reflecyion.Assembly.Load for delayed loading av dll-en. 8803247[/snapback] bummer... Å bruke den som reference krasjer desverre... Jeg har en reserveløsning, ikke særlig elegant, eller kjapt, men det går å kjøre et mC++ program som bruker den dllen. Er System.Reflection.Assembly.Load vanskelig å bruke? Mye å sette seg inn i? Lenke til kommentar
GeirGrusom Skrevet 7. juni 2007 Del Skrevet 7. juni 2007 Assembly.Load er ganske enkel å bruke, men jeg tror ikke det hjelper så mye, samme feilen vil jo dukke opp allikevel. Du må nok finne ut hvorfor Dll-en ikke lar seg laste. Men prøv å åpne dll-en i Object Viewer. Lenke til kommentar
Mr Burns Skrevet 9. juni 2007 Forfatter Del Skrevet 9. juni 2007 Jeg ser alle metodene i dllen i Object Browser, problemt erikke å åpne dllen på utviklingsmaskinen, det er på den andre maskinen det krasjer... Den som kjører winXp Embedded og ikke har de store debuggingsmulighetene... Lenke til kommentar
Mr Burns Skrevet 19. juni 2007 Forfatter Del Skrevet 19. juni 2007 Virker nå, lagde en installer for DLLen. Lenke til kommentar
GeirGrusom Skrevet 19. juni 2007 Del Skrevet 19. juni 2007 Da var det kanskje MSVCRT70.dll som manglet eller noe da? Lenke til kommentar
Mr Burns Skrevet 19. juni 2007 Forfatter Del Skrevet 19. juni 2007 Vanskelig å si... Kanskje MSVCRT80.dll? Hvem vet... I og med at jeg fikk fileloadexception ved instansiering av dllen, tror jeg det har med GACen å gjøre. Setupen fikset nok en del filer inn der det trengtes... Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå