Gå til innhold

C#: Hvordan bruke managed c++ klasser/funskjoner i C#?


Anbefalte innlegg

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
Videoannonse
Annonse

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 av Mr Burns
Lenke til kommentar

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
  • 1 måned senere...

Av forskjellige grunner som jeg ikke forstår, virker ikke dette som planlagt :cry:

 

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 av Mr Burns
Lenke til kommentar

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
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
  • 2 uker senere...

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...