C# コードで 2 つの構造を作成しました。
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class RollInformationCSharp
{
[MarshalAs(UnmanagedType.R8)]
public double rollDiameter;
[MarshalAs(UnmanagedType.R8)]
public double initialRoughness;
[MarshalAs(UnmanagedType.R8)]
public double finalRoughness;
[MarshalAs(UnmanagedType.R8)]
public double accumulateCombination;
[MarshalAs(UnmanagedType.R8)]
public double critialRollLength;
[MarshalAs(UnmanagedType.R8)]
public double rolledLength;
[MarshalAs(UnmanagedType.R8)]
public double percentageLifeRoll;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 256)]
public string rollName;
};
と :
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class MultiRollCSharp
{
[MarshalAs(UnmanagedType.I4)]
public int nbRoll;
public RollInformationCSharp[] tabRoll;
}
C# コードでは、C++ dll の関数を呼び出します。
[DllImport("DLL_RaFTmodel.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr DLL_FlesCalculation(MultiRollCSharp multiRollInfo,
CoilInformationCSharp coilInfo,
RollInformationCSharp rollInfo,
LimitsTypeCSharp LimitsSteel,
LimitsTypeCSharp LimitsRegulation,
LimitsTypeCSharp LimitsMachine,
FTInputsCsharp forceTensionInfo,
RaConstantsCSharp RaModelIn,
FTWeightCsharp FTmodelIn,
[In, MarshalAs(UnmanagedType.I4)] int strategy,
[In, MarshalAs(UnmanagedType.I4)] int rollLifeMaximization,
RaInputsCsharp RaDataIn,
char Version,
[In, MarshalAs(UnmanagedType.R4)] float errMax,
[Out, MarshalAs(UnmanagedType.I4)] out int error);
C++ には、2 つの構造体もあります。
struct RollInformation
{
double rollDiameter;
double initialRoughnessRoll;
double finalRoughnessRoll;
double accumulateCombination;
double percentageLifeRoll;
double criticalRollLength;
double rolledLength;
char rollName[256];
};
と
struct MultiRollInformation
{
int nbRoll;
RollInformation* tabRoll;
};
関数は次のようにも宣言されています。
extern EXPORTTOTEM_API
MULTICURVETYPE* DLL_FlesCalculation( struct MultiRollInformation *multiRollInfo, struct CoilInformation *coilInfo,
struct RollInformation *rollInfo,
struct LimitsType *LimitsSteel,
struct LimitsType *LimitsRegulation,
struct LimitsType *LimitsMachine,
struct FTInputs *forceTensionInfo,
struct RaConstants *constRaIn,
struct FTWeight *modelFTIn,
int strategy,
int rollLifeMaximization,
struct RaInputs *dataRaIn,
char Version,
float errMax,
int &error);
C# で構造体を埋める例:
MultiRollCSharp multiRollInfo = new MultiRollCSharp();
for(int i = 0; i < 5; i++)
{
RollInformationCSharp rollInfo1 = GetRollInformation();
int taille = 0;
if (multiRollInfo.tabRoll != null)
taille = multiRollInfo.tabRoll.Length;
RollInformationCSharp[] tab = new RollInformationCSharp[taille +1];
if (taille > 0)
{
multiRollInfo.tabRoll.CopyTo(tab, 0);
}
tab[tab.Length-1] = rollInfo1;
multiRollInfo.tabRoll = tab;
multiRollInfo.nbRoll += 1;
}
デバッグ モードでは、DLL への呼び出しの直前に、C# の両方の構造が正しい (multiRollInfo と rollInfo) です。C++ では、rollInfo が適切です。しかし、マルチロール情報には 5 つの要素がありますが、値が間違っています。
なにが問題ですか?どうすればこれを修正できますか?
ご助力ありがとうございます