Hej, Du måste skapa en managed struct också. Sedan får du nog kopiera från din unmanaged struct till din managed struct.Återanvända C-kod i ett C# projekt
Jag vill kunna återanvända beräkningsrutiner utvecklade i C i ett C# projekt.
Jag använder Visual Studio och har skapat två projekt i min Solution. Ett C#-projekt och ett C++-projekt.
C++-projektet består av den C-kod som jag vill återanvända och C++-kod som representerar den "Wrapper" som anropar C-koden. C-koden definierar en struct och en funktion som returnerar en struct av den typen. Med hjälp av "Wrappern" vill jag kunna återanvända och anropa funktionen som är definierad i C-koden. Detta fungerar men jag kommer inte åt structens fält i C#-projektet. Varför gör jag inte det?
Nedan har jag försökt skriva ett utdrag av koden. Hoppas att jag lyckats förklara mitt problem tillräckligt och att någon kan hjälpa mig...
Mvh
Pär Nygren
### C++-projektet ###
----------------------
<<< C.h >>>
----------------------
#ifndef __C_H
#define __C_H
#if defined(__cplusplus)
extern "C" {
#endif
struct SPOINT {
double dblX;
double dblY;
};
SPOINT CreatePoint(double dblX, double dblY);
#if defined(__cplusplus)
}
#endif
#endif
----------------------
<<< C.cpp >>>
----------------------
#include "C.h"
SPOINT CreatePoint(double dblX, double dblY);
{
SPOINT p;
p.dblX = dblX;
p.dblY = dblY;
return p;
}
----------------------
<<< CWrapper.h >>>
----------------------
#ifndef __CWRAPPER_H
#define __CWRAPPER_H
#include "C.h"
namespace CWrapper {
public __gc class CWrapper {
public:
SPOINT CWrapperCreatePoint(double dblLatitude, double dblLongitude);
};
}
#endif
----------------------
<<< CWrapper.cpp >>>
----------------------
#include "CWrapper.h"
#include "C.h"
SPOINT CWrapper::CWrapper::CWrapperCreatePoint(double dblLatitude, double dblLongitude) {
SPOINT p = CreatePoint(dblLatitude, dblLongitude);
return p;
}
----------------------
### C#-projektet ###
----------------------
<<< Form1.cs >>
private void Btn_Click(object sender, System.EventArgs e) {
CWrapper o = new CWrapper();
SPOINT p = o.CWrapperCreatePoint(12, 14);
// I debugg-läge kan jag se att structen p har fälten dblX och dblY och att deras värden är satta till 12
// respektive 14
double dblX = p.dblX; //Denna rad resulterar i ett kompileringsfel
}Sv: Återanvända C-kod i ett C# projekt