У меня есть структура C++, которая имеет char [20], как показано ниже, и она упакована.char [] эквивалент массива в C#
#pragma pack(push, temp_aion_packed, 1)
struct temp
{
char x[20];
char y[20];
};
#pragma pack(pop, temp_aion_packed)
Теперь, как я могу написать эту структуру в C#, чтобы обе были одинаковыми. я написал, как это в C#
[DataContract]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1),Serializable]
public class temp
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string x;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string y;
}
ниже декларация PInvoke в C#
[DllImport("rmsCAPI.dll", CallingConvention = CallingConvention.StdCall, ExactSpelling = true, EntryPoint = "OrderRequirement")]
public static extern int OrderRequirement(ref temp tmp);
с функцией ++, которая вызывает эту структуру в качестве параметра
long __stdcall OrderRequirement(struct temp *tmp)
{
string p="";
string q="";
p=temp->x;
q=temp->y;
char buff[2048];
sprintf(buff,"p: %s\n q: %s\n x: %s\n y: %s\n",p,q,temp->x,temp->y);
}
, но когда я делаю, как это в C# он дает мне ненужные данные в C++, когда я присваиваю значения для них в C#. Может ли кто-нибудь помочь.
Спасибо всем за помощь по вышеуказанному, но теперь у меня есть новая проблема, которая является продолжением этого, я предоставляю все подробно ниже.
Мои структуры в C++
#pragma pack(push, temp_aion_packed, 1)
struct temp
{
long req;
struct type m_type;
short id;
char x[20];
char y[20];
};
#pragma pack(pop, temp_aion_packed)
#pragma pack(push, type_aion_packed, 1)
struct type
{
short i;
};
#pragma pack(pop, type_aion_packed)
я написал эквивалентные C# Структуры, как этот
[DataContract]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1),Serializable]
public struct temp
{
[DataMember]
public long req;
[DataMember]
[MarshalAs(UnmanagedType.Struct)]
public type m_type;
[DataMember]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string x;
[DataMember]
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string y;
}
[DataContract]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1),Serializable]
public struct type
{
[DataMember]
public short i;
}
ниже моего C# PInvoke
[DllImport("rmsCAPI.dll", CallingConvention = CallingConvention.StdCall, ExactSpelling = true, EntryPoint = "OrderRequirement")]
public static extern int OrderRequirement(ref temp tmp);
ниже мой с методом ++, который вызывает-структуру в качестве параметра
long __stdcall OrderRequirement(struct temp *tmp)
{
char buff[2048];
sprintf(buff,"req: %ld \n id: %d \n x: %s\n",tmp->req,tmp->id,tmp->x);
}
Теперь проблема заключается в том, что у меня есть структурная переменная m_type (struct "type"), объявленная в struct temp, переменные, объявленные ранее (long req), которые хорошо печатаются в моей программе на C++, но объявленная переменная после этого не дают мне выхода. Так что, я думаю, что объявление структур в C# испортилось, и я не могу понять это, поэтому любой может помочь.
Я думаю, вы хотите байт [20]. – Ben
@Ben 'byte [20]' не компилируется в C#. –
@ DavidHeffernan - я представил все подробно сейчас – krishna555