PInvoke. Passer struct contenant pointeur vers autres struct de C# à C.
Voici mon problème. J'ai ce code en C:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
GTO_EXPORT(int ) GtoCapFloorAvgVol(
TDate capStartDate, /* (I) */
TDate capExpiryDate, /* (I) */
double *strikeRates, /* (I) */
int numStrikeRates, /* (I) */
double *principles, /* (I) */
int numPrinciples, /* (I) */
int moneymarketDen, /* (I) # days/year */
TDateInterval *resetPeriod, /* (I) Time Between caplets */
int optionType, /* (I) Cap or Floor */
char stubPosition, /* (I) 2/16/94 GG 'F'ront or 'B'ack */
TCurve *zeroCurve, /* (I) For discounting */
double price, /* (I) Price */
double avgVolGuess, /* (I) Average Volatility guess */
double *avgVol); /* (O) Average Volatility */
Et voici les structs:
typedef struct _TCurve
{
int fNumItems; /* Number of TRatePts in fArray */
TRatePt *fArray; /* Dates & rates */
TDate fBaseDate; /* Discount date */
double fBasis; /* Number compounding periods / year */
long fDayCountConv; /* How the year fraction is computed */
void *fClassHandle; /* C++ class handle implementation */
} TCurve;
typedef struct
{
TDate fDate;
double fRate;
} TRatePt;
et j'ai typedef long int TDate; |
J'écris un wrapper en C#. Voici ce que j'ai:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
[DllImport("alib.dll", EntryPoint = "GtoCapFloorAvgVol")]
public static extern int CapFloorAvgVol(
long capStartDate, /* (I) */
long capExpiryDate, /* (I) */
double[] strikeRates, /* (I) */
int numStrikeRates, /* (I) */
double[] principles, /* (I) */
int numPrinciples, /* (I) */
int moneymarketDen, /* (I) # days/year */
ref TDateInterval resetPeriod, /* (I) Time Between caplets */
int optionType, /* (I) Cap or Floor */
char stubPosition, /* (I) 2/16/94 GG 'F'ront or 'B'ack */
[In] IntPtr zeroCurve, /* (I) For discounting Pointer to TCurve*/
double price, /* (I) Price */
double avgVolGuess, /* (I) Average Volatility guess */
out double avgVol); /* (O) Average Volatility */
[StructLayout(LayoutKind.Sequential)]
public struct TRatePt
{
public long fDate;
public double fRate;
};
public struct TCurve
{
public int fNumItems; /* Number of TRatePts in fArray */
public TRatePt[] fArray; /* Dates & rates */
public long fBaseDate; /* Discount date */
public double fBasis; //ZERO_CURVE_BASIS in capvoll.c which is #defined as ANNUAL_BASIS 1 /* Number compounding periods / year */
public long fDayCountConv; //ZERO_CURVE_DAY_COUNT_CONV in capvoll.c which is #defined as GTO_ACT_365F; = 2L /* How the year fraction is computed */
public IntPtr fClassHandle; /* C++ class handle implementation */
}; |
Pour l'appel de la fonction je fais ça:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
//create zeroCurve with data above and then does the necessary for it to be a pointer as required by C++ dll
TCurve _zeroCurve = new TCurve()
{
fBaseDate = _tempValueDate,
fNumItems = _tempZeroCurveDates.Length,
fArray = _ratePoints,
fBasis = 2L,
fDayCountConv = 1
};
int _sizeOfTCurve = Marshal.SizeOf(typeof(TCurve));
IntPtr p_zeroCurve = Marshal.AllocHGlobal(_sizeOfTCurve);
Marshal.StructureToPtr(_zeroCurve, p_zeroCurve, false);
int _status = CapFloorAvgVol(_tempStartDate, _temPexpiryDate, strikeRates, strikeRates.Length, principles, principles.Length, moneymarketDen,
ref _resetPeriod, optionType, stubPosition, p_zeroCurve, price, avgVolGuess, out avgVol); |
En gros je déclare un pointeur et le passe à la fonction. Maintenant, j'ai un problème au niveaus du fArray... Côté C il ne contient pas du tout les bonnes valeures. Du coup j'ai du me tromper quelque part? Peut-être que je dois rajouter un MarshalAs dans TCurve mais je vois pas quoi?
Est-ce que je l'ai bien défini? Dois-je aussi le définir en tant que pointeur dans TCurve? Je l'ai pas fait parce que je pense les membres sont blittable donc devrait pouvoir être passé directement non?
PS: dsl pour les quelques mots d'anglais, je ne connais pas le vocabulaire en français...
Merci d'avance au courageux qui voudraient bien m'aider.