Gå til innhold

Anbefalte innlegg

Folkens. Har en liten utfordring til dere

 

Jeg har laget en C++/CLI wrapper som gjør at jeg fra Clarion kan kalle .NET komponenter direkte, vel rettere sagt indirekte.

Dette er grei skuring. Men jeg trenger en måte å få til callback inn i samme "scope" som oppkallet kom ifra. Dette fordi det kallende programmet har satt opp en masse globale parametere som connection string, user login, rettigheter + + +

 

Dette fungerer greit fra Clarion, fordi Clarion kan interface c++ klasser direkte uten noe problem ved å bruker INTERFACE.

 

Det betyr at jeg har startet et Clarion progra, som igjen kaller en "external" prosedyre i en C++ dll, som igjen instanserer en klasse. Denne klassen er kompilert i #pragma managed og kan derfor kalle .NET klasser direkte. Vel og bra. Jeg har med andre ord laget koblingen Clarion => .NET

 

Nå trenger jeg å kalle tilbake. Jeg har en dullion fuksjoner i Clarion programmet som jeg vil nyttegjøre fra .NET

 

Tanken min var å lage et tilsvarende Interface i C++ og bruke dette i C# koden, men jeg misstenker at livet ikke er så enkelt.

 

Hvis noen kunne gi et kjappt eksempel på hvordan dette kan gjøres så hadde det vært gull

Lenke til kommentar
Videoannonse
Annonse

For COM objekter går det fint (altså klasser som arver fra IUnknown) du trenger bare å bruke noen marshall funksjoner. For native C++ vet jeg ikke. Det kan tenkes at Marshal klassen har funksjoner for å referere til native interfaces, men jeg vet ikke.

 

Kikk på Marshal klassen (System.Runtime.InteropServices.Marshal) og se om den har noe du kan bruke.

 

Utover det kan callback prosedyrer utnyttes gjennom delegates (Marshal.FunctionPtrToDelegate og Marshal.DelegateToFunctionPtr tror jeg de heter)

 

Jeg tror det også finnes funksjoner for å gjøre om native klasser til .NET objekter, men merk at det er masse sikkerhetsrisikoer og uventet oppførsel forbundet med dette. Det tryggeste er nok å lage en wrapper klasse.

Lenke til kommentar

Ok. Følgende skjer:

Fra Clarion så kaller jeg en external func i en C++ DLL som ser slik ut:

extern "C" __declspec(dllexport) iComunisafe * __stdcall SetComunisafeInterOP(iClarion * pClarionCallback)
{
ComunisafeClass ThisInterOP = new ComunisafeClass(pClarionCallback);
return ThisInterOP;
}

Det som skjer er at C++ prosedyren instanserer et objekt av klassen Communisafe. Constructoren tar imot et interface definert i Clarion og konstruktoren har dermed en callback til Clarion programmet, samtidig som at Clarion programmet har et sugerør inn i C++ programmet, som igjen kan snakke med C# programmene mine.

 

Dette er vel og bra.

 

Men jeg har også behov for å kalle tilbake fra C# programmene slik at jeg kan eksempelvis kalle rutiner som "GetNewCustomerID" som er en veldig komplisert rutine i programmet vårt. Jeg orker ikke tanken på å skrive den om til .NET og tenkte derfor at jeg like greit kunne få C# programmene til å utnytte denne prosedyren gjennom samme interface. Tilsynelatende er jo dette kokt mat og veldig triviellt, men så viser det seg jo at et Interface i C# slett ikke er å regne som et ekte Interface (ref et tidligere innlegg jeg har gjort) og dermed tror jeg ikke jeg kan sende et C++ interface inn i C# som tilgjengeliggjør C++ funksjoner for C# programmene.

 

Jeg kan selvsagt bruke PInvoke og kalle metodene gjennom DllImport og slikt, men synes dette er ekstremt sølete fordi jeg da må eksportere og lage LIB filer hver gang jeg endrer på prototyper. Min C++ wrapper som jeg har laget inneholder kunn EN eksportert metode som igjen utveksler interfaces. Det betyr at prototype endringer funker etter kompillering uten noe mere surr.

Lenke til kommentar

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...