PDA

View Full Version : آموزش: Marshalling



ali.rezaei7
پنج شنبه 15 مهر 1389, 18:38 عصر
سلام
چند وقتی هست که به مبحث Marshalling برخورد کردم. ولی هنوز چیز زیادی دستگیرم نشده. اگه دوستان زحمت بکشن که در این تاپیک، به آموزش Marshalling با ذکر مثال برپدازند، خیلی خیلی ممنون می شم.

r00tkit
پنج شنبه 15 مهر 1389, 22:28 عصر
سلام

مارشالینگ پروسسی هستش برای تغییر شکل دادن حالات object ها در حافظه به طوری که برای ذخیره یا انتقال به محیط دیگه مناسب بشه

در .net مارشالینگ برای تبدیل بین unmanaged تایپ و CLR تایپ در P/invoke ,COM intropاستفاده می شه

متاسفانه چون بحث مارشالینگ طولانی و پر از نکات هستش و شما چیز کلی گفتید شما رو به خوندن مطالب موجود در لینک زیر توصیه می کنم

http://msdn.microsoft.com/en-us/library/eaw10et3.aspx

salehbagheri
جمعه 16 مهر 1389, 09:16 صبح
در ادامه صحبتهاي آقاي geek1982:

مارشالينگ به نام هاي ديگري همچون Inflating و Serialize نيز معروف هست.

ali.rezaei7
جمعه 16 مهر 1389, 09:29 صبح
از اینکه به این موضوع بها می دید ممنونم. ولی اگه موضوع رو بازتر کنید، عالی می شه.

r00tkit
جمعه 16 مهر 1389, 13:47 عصر
سلام

مثال:



class PlatformInvokeTest
{
[DllImport("msvcrt.dll")]
public static extern int puts([MarshalAs(UnmanagedType.LPStr)]string m);
[DllImport("msvcrt.dll")]internal static extern int _flushall();


public static void Main()
{
puts("Hello World!");
_flushall();
}
}
توضیح: وقتی توی C#‎‎ تابع های unmanaged رو فراخوانی می کنید CLR باید پارامتر ها و نوع بازگشتی رو مارشالینگ بکند

برای هر نوع در .net یه نوع پیش فرض در محیط غیر مدیریت شده وجود داره که CLR از این پیش فرش ها استفاده می کنه برای مارشال کردن خود کار در موقع فراخوانی توابع unmanaged

که به طور مثال string در .net به LPTSTR مارشال می شه( تبدیل می شه)

شما می تونی از MarshalAs استفاده کنی و بگی که فلان نوع از .net به چی مارشال بشه



و یه نکته می مونه در کنار تائید صحبت های اقای salehbagheri این رو بگم که در بعضی زبان ها Serialize و مارشالینگ فرق دارن(مثل همین C#‎‎) و در بعضی زبان ها نه ( مثل Ruby روبی با Marshal.dump و Marshal.load مارشالینگ یا Serialize می کنیم)

مثال در روبی


def marshaling(x)
y=Marshal.dump(x)
end

def unmarshaling(x)
y=Marshal.load(x)
end

x=marshaling('ten')

puts unmarshaling(x)
اگه سوالی بود در خدمتیم