StructLayout?????
ايه المقصود منها و الستفادة؟؟؟???
StructLayout?????
ايه المقصود منها و الستفادة؟؟؟???

<marquee>
مش موجود بصفة دايمة للامتحانات
</marquee>
دوت نيت لا يضمن أن يتم تخزين أعضاء الـstructs بطرقة معينة، اي أنه من الممكن أن تكون مخزنة في أجزاء غير متصلة مع بعضها البعض.
struct Random
{
int i1;
string s1;
}في المثال السابق من غير المعروف ان كان i1 يقع في عنوان الذاكرة السابق لـs1.. ليس هناك مشكلة في دوت نيت، ولكن المشكلة عندما يتطلب الأمر منك أن تستدعي دالة API مثلا، فعندها لابد أن يكون i1 في العنوان السابق تماما لـs1.. ولذلك StructLayout موجودة في سي شارب لتعطيك الامكانية للتحكم في تخزين الـstrcut..
StructLayout.Sequential يضمن لك أن يتم التخزين بالتتابع:
StructLayout(LayoutKind.Sequential)]
struct Sequential
{
int i1;
string s1;
}أما Explicit فيسمح لك بامكانية أكبر للتحكم في الفواصل بين الاعضاء..
تم تعديل هذه المشاركة بواسطة BAZRAMIT في 31 مارس 2004 في 23:59
شكرا على الرد
طيب وال MarshalAs???
ايه فائدتها؟؟؟؟؟

<marquee>
مش موجود بصفة دايمة للامتحانات
</marquee>
تستخدم MarshalAs لتحديد ماهية المتغير من وجهة نظر COM..
مثلا اذا كنت تعاملت مع COM فيما سبق ستعرف أن BSTR يستخدم لتعريف ما يمكن أن يقابل في سي شارب string.. وستضطر لعمل مارشال للـstring الى Bstr..
أيضا عندما تستخدم دوال APIs ستضطر لعمل Marshalling لبعض المتغيرات، ودعني أعطيك مثالا..
هنالك structure في يسمى FILE_INFO_3 SDK:
typedef struct _FILE_INFO_3 {
DWORD fi3_id;
DWORD fi3_permissions;
DWORD fi3_num_locks;
LPWSTR fi3_pathname;
LPWSTR fi3_username;
} FILE_INFO_3, *PFILE_INFO_3, *LPFILE_INFO_3;إذا أردت أن تقوم بتعريف structure مطابق للمذكور في سي شارب تقوم بكتابته كالتالي:
[StructLayout(LayoutKind.Sequential)]
struct FILE_INFO_3
{
public int fi3_id;
public int fi3_permissions;
public int fi3_num_locks;
[MarshalAs(UnmanagedType.LPWStr)] fi3_pathname;
[MarshalAs(UnmanagedType.LPWStr)] fi3_username
}هذا الموضوع مغلق.