C++ DLL aanroepen vanuit C# ?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Okee, ik probeer dus een C++ DLL aan te roepen vanuit C#.

Deze code heb ik (o.a) in m'n C++ DLL:

double SmoothingSplines::PrintTest( double x )
{
x = x*2;
return ( x );
}

En deze code in C#:

SmoothingSplines SS = new SmoothingSplines();
Console.WriteLine( SS.PrintTest( 10));

Zoals verwacht wordt er "20" in de console geprint. Dus de DLL wordt netjes herkend enzo :). Maar nu wil ik de variable vanuit C# indirect referencen. Code in mijn DLL (weet niet zeker of dit correct is):

double SmoothingSplines::PrintTest( double *x )
{
*x = (*x)*2;
return ( *x );
}

Maar hoe roep ik dit nu aan in C#? :?

Acties:
  • 0 Henk 'm!

  • OMX2000
  • Registratie: Januari 2001
  • Laatst online: 23:24

OMX2000

By any means necessary...

ref voor je parameter?

Dè developers podcast in je moerstaal : CodeKlets Podcast


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zo bijvoorbeeld?

double ww = 10;
Console.WriteLine( SS.PrintTest( ref ww));

Werkt niet.
"The best overloaded method match for 'SmoothingSplines.PrintTest(double*)' has some invalid arguments"

Acties:
  • 0 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 21-08 23:06

HMS

Misschien moet je terug grijpen op unsafe code :X?

edit:

Wat ik bedoel is: volgens mij gebruik je in je C++ assembly unmanaged code, en dat kan niet zomaar in een managed omgeving gedraait worden.

[ Voor 61% gewijzigd door HMS op 12-04-2010 16:34 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
HMS schreef op maandag 12 april 2010 @ 16:31:
Misschien moet je terug grijpen op unsafe code :X?

edit:

Wat ik bedoel is: volgens mij gebruik je in je C++ assembly unmanaged code, en dat kan niet zomaar in een managed omgeving gedraait worden.
Volgens mij gebruik ik geen unmanaged code.

"cannot convert from 'ref double' to 'double*"

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je werkt op dit moment in C++/CLI neem ik aan? Wat is de reden dat je indirect wil werken? Vanuit unsafe C# code kun je ook gewoon met pointers werken.

Maar afhankelijk van wat je precies wil kun je ook gewoon by-ref door geven ( ^% in C++/CLI volgens mij, maar dat kan je gewoon nazoeken in de documentatie )
C++:
1
double SmoothingSplines::PrintTest( double^% x )

offtopic:
^^is C++/CLI echter die heeft geen syntax highlighting

C#:
1
double PrintTest( ref double x )

Of met een unsafe block
C#:
1
2
3
4
5
6
7
double a = 1.0;
unsafe
{
    fixed (double* b = &a)
    {
    }
}

[ Voor 31% gewijzigd door Woy op 12-04-2010 16:55 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:53

Haan

dotnetter

double* is een pointer in C++ toch? In C# kan je dat ook wel gebruiken, maar dan moet je met het unsafe keyword gaan werken.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Misschien een reference gebruiken in C++ ipv een pointer?
C++:
1
2
3
4
double SmoothingSplines::PrintTest(double& x) {
  x = x * 2;
  return x;
}

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op maandag 12 april 2010 @ 16:48:
Je werkt op dit moment in C++/CLI neem ik aan? Wat is de reden dat je indirect wil werken? Vanuit unsafe C# code kun je ook gewoon met pointers werken.
Uiteindelijk moet ik een array gaan doorgeven naar een C++ DLL. Naar ik begrijp moet dat indirect. Omdat ik het niet werkend kreeg probeer ik eerst eens een enkele variable door te geven naar een C++ DLL (als test). Alles zo eenvoudig mogelijk maken. Doorgeven van de value gaat, dus ik weet dat de DLL op zich draait enzo. Maar nu dus via een pointer :?

Ik ben geen ervaren programmer btw, dus ik ga er vanuit dat ik ergens iets over het hoofd zie... maar wat?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
JanDM schreef op maandag 12 april 2010 @ 16:54:
Misschien een reference gebruiken in C++ ipv een pointer?
C++:
1
2
3
4
double SmoothingSplines::PrintTest(double& x) {
  x = x * 2;
  return x;
}
Dit geeft dezelfde foutmelding:
"cannot convert from 'ref double' to 'double*'"

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op maandag 12 april 2010 @ 16:48:
Je werkt op dit moment in C++/CLI neem ik aan? Wat is de reden dat je indirect wil werken? Vanuit unsafe C# code kun je ook gewoon met pointers werken.

Maar afhankelijk van wat je precies wil kun je ook gewoon by-ref door geven ( ^% in C++/CLI volgens mij, maar dat kan je gewoon nazoeken in de documentatie )
C++:
1
double SmoothingSplines::PrintTest( double^% x )

offtopic:
^^is C++/CLI echter die heeft geen syntax highlighting

C#:
1
double PrintTest( ref double x )

Of met een unsafe block
C#:
1
2
3
4
5
6
7
double a = 1.0;
unsafe
{
    fixed (double* b = &a)
    {
    }
}
Met dat unsafe block krijg ik de foutmelding:
"You cannot use the fixed statement to take the address of an already fixed expression"

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
JanDM schreef op maandag 12 april 2010 @ 16:54:
Misschien een reference gebruiken in C++ ipv een pointer?
C++:
1
2
3
4
double SmoothingSplines::PrintTest(double& x) {
  x = x * 2;
  return x;
}
Okee, dit in combinatie met

C#:
1
2
3
4
5
            double ww = 10;
            unsafe
            {
                Console.WriteLine(SS.PrintTest(&ww));
            }


Werkt *O*

Nu eens zien of ik op deze manier ook arrays werkend krijg...

Maar ik begrijp nog steeds niet waarom het via unsafe moet als zowel de C++ DLL als de C# in .NET zijn geschreven. :? Waarom werkt die ref niet?
En welke risico's loop ik nu allemaal met die unsafe code? :{

[ Voor 5% gewijzigd door Verwijderd op 12-04-2010 17:33 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op maandag 12 april 2010 @ 17:31:
[...]

Nu eens zien of ik op deze manier ook arrays werkend krijg...
Niet dus :{

"Cannot take the address of, get the size of, or declare a pointer to a managed type ('double[]')"

Acties:
  • 0 Henk 'm!

  • G70boX
  • Registratie: Juli 2004
  • Laatst online: 22:54
Hoe ik ooit een C++ dll in een C# programma heb gebruikt......

code:
1
2
[DllImport("naam.dll")]
public static extern unsafe void calcCoeff([MarshalAs(UnmanagedType.LPArray)] double[] rdata);


Kijk anders eens naar het marshallen van parameters.

Acties:
  • 0 Henk 'm!

  • Hyperz
  • Registratie: Augustus 2009
  • Laatst online: 09-07 02:45
Ik dacht dat de IntPtr struct juist bedoelt was om met pointers te werken zonder unsafe code te moeten gebruiken. Of heb ik het verkeerd begrepen :?

Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:27

Creepy

Tactical Espionage Splatterer

SeLang: zou je de volgende keer de edit knop willen gebruik i.p.v. een paar post achter elkaar te doen? Thanks.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Woy schreef op maandag 12 april 2010 @ 16:48:
Je werkt op dit moment in C++/CLI neem ik aan? Wat is de reden dat je indirect wil werken? Vanuit unsafe C# code kun je ook gewoon met pointers werken.

Maar afhankelijk van wat je precies wil kun je ook gewoon by-ref door geven ( ^% in C++/CLI volgens mij, maar dat kan je gewoon nazoeken in de documentatie )
C++:
1
double SmoothingSplines::PrintTest( double^% x )
double^% is een reference naar een managed pointer naar double. Vergelijkbaar met *& dus, een reference naar een pointer. Maar een double is een value type, geen reference type, dus feitelijk wil je gewoon double%.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 21-08 21:44
array<int>^ dat is een managed int array in C++/CLI, als de functie die je aanroept niet in unmanaged mode gebruikt moet worden is dat je oplossing om een array door te geven.

Waarom ref niet werkt als je & of * gebruikt is omdat dat unmanaged operators zijn zoals hiervoor al aangegeven zijn de managed varianten ^% en ^.

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op maandag 12 april 2010 @ 16:57:
[...]
Uiteindelijk moet ik een array gaan doorgeven naar een C++ DLL. Naar ik begrijp moet dat indirect.
Een array zal je inderdaad by-ref door moeten geven want het is geen value type, maar dat is dus geen reden om met native pointers of references te gaan werken! Overigens zou het fixed blok wel werken als je die gebruikt met een array van doubles. De reden dat je hem daar niet kunt gebruiken is omdat de double al op de stack staat en dus al niet verplaatst mag worden door de .NET runtime.

NC83 geeft hierboven al de betere oplossing.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1