PDA

نسخه کامل مشاهده نسخه کامل : Close Source کردن DLL م + Cross-Thread



dogtag
31-03-2009, 14:21
سلام علیکم.
من هنوز رو همون namespace و کلاس های حودمم. (:46:) [نمیشه 1 تاپیک واسه همه ی سوالام داشته باشم؟]

ولی 1 چیز عجیب دیدم!

بعد از این که پروژه ام رو به صورت Class Library در آوردم، DLLش رو تو مراجع یه برنامه دیگه اضافه کردم.
چون هنوز کامل نیست، یه جا اون DLL ه Exception داد و در کمال تعجب، تمام سورسم رو نشون داد :18::2:

[شوخی » این بود که واسه PHP کار ها قیافه میومدید که ما سورس بسته ایم :دی]

خب این رو چجوری مخفی کنم؟
(منظورم یه defuscate ساده نیست ها! کاملاً کامپایل شده و غیر قابل دید می خوام. مثل CPP)

استاد H2 هم یه چیزی در مورد مخفی کردن namespace در حالت کامپال شده فرمودند. اون رو هم لطفاً توضیح دهید.

=====

و حالا این Cross-Thread:

من یه Thread ایجاد می کنم و اون یه سری کار هایی می کنه و بعد از به نتیجه رسیدن، یه Event رو صدا می زنه.
آقای استفاده کننده هم رو Eventم یه کاری می کنه.
ولی اون هم با کمال تعجب برام یه Exception داد که Cross-Thread تعطیل!!! :41:

حالا من بیام به همه ی استفاده کننده ها بگم که یه »

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اضافه کن؟!؟!

=====

همین دیگه.

کمک بفرمایید! :11:

_H2_
03-04-2009, 00:14
سلام

چون هنوز کامل نیست، یه جا اون DLL ه Exception داد و در کمال تعجب، تمام سورسم رو نشون داد
اگر کل سورس را در زمان دیباگ مشاهده کرده اید اصلاً نگران نباشید !
کدهای دات نت قابل Decompile است ولی این مشکل شما ربطی به آن ندارد.

وقتی شما پروزه خود را در (مثلاً همان DLL) در حالت DEBUG کامپایل میکنید، فایل DLL نهایی بزرگتر میشود و شامل اطلاعات و منابع لازم برای اشکال یابی هم میشود ...
و آدرس فایلهای سورس را هم شامل میشود، تا در زمان Debug برنامه VS بتواند پشتیبانیهای خاص و ویژه ای در جهت Debug راحت و ساده و سریعتر و پیشرفته تر را ارائه دهد.

میتوانید تست کنید و بعد از کامپایل پوشه سورس اصلی را تغییر مکان دهید، خواهید دید در زمان Debug دیگر سورس نشان داده نمیشود...
یعنی سورس از محل رایانه خودتان تامین میشود و در انتقال به رایانه های دیگر مشکلی ایجاد نمیشود.

به معنای Debug دقت کنید ... اشکال یابی!

در نهایت، شما باید پروژه نهایی را در حالت Release کامپایل کنید و نسخه Release (انتشار) نسخه بهینه و آماده انتشار عمومی و استفاده عملی در سایر برنامه ها است.


ولی اون هم با کمال تعجب برام یه Exception داد که Cross-Thread تعطیل!!!
شما باید دردسترسی به کنترلرها از ریسمان اصلی خودشان استفاده کنید.
یکی از ساده و معمولترین روشها استفاده از متد Invoke از کلاس پایه Control است.

مثلاً اگر متد NewMethod را از هر ریسمانی فراخوانی کنید، فرقی ندارد و در پخش Any code شما میتوانید با اطمینان متدهای دیگر را اجرا کنید و به controlvariant و تمام کنترلرهای مشابه ان که از یک ریسمان تولید شده اند، دسترسی کامل داشته باشید.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

موفق باشید.

dogtag
03-04-2009, 00:56
ممنون.

ولی این بخش دوم خیلی گویا نبود.
میشه example-oriented عمل کنید؟

مرسی

dogtag
03-04-2009, 14:20
2 تا سوال دیگه هم پیش اومده که بذارید بپرسم.

1- من وقتی یه متغیر رو مثلاً []String تعریف می کنم، اصولی ترین راه از بین بردنش چیه؟
وقتی کارم باهاش تموم شد، مساری null بکنم؟ یا روش بهتری هم هست؟


-----

2- من به []Byte دارم که طولانیه و 2 - 3 بار توش این نوشته شده "salam"
(الیته توجه دارید که، هر حرف در یک درایه اش)

من این رو چجوری می تونم splitش کنم؟
که به 3 - 4 قسمت تقسیم سه و اون salam بشه delimiterش؟

راه تعریف شده داره؟ یا باید خودم بنویسم؟

راستی، اگر برای Generic List از نوع byte هم بشه، باز هم خوبه.

مرسی

dogtag
03-04-2009, 21:01
برای راه دوم، این رو نوشتم:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

البته به نظرم اصلاً بهینه نیستو
چون رو هوا نوشتم، اون حلقه رو مطمئن نیستم.


--


راستی، در کل استفاده از Generic List روش خوبیه؟

آخه در این رابطه نبما می گفت dataset عالیه ولی استاد h2 می گه بد ترین راهه! پدر رم و سی پی یو رو در میاره!

منتظرم

M E H D I
04-04-2009, 00:31
2 تا سوال دیگه هم پیش اومده که بذارید بپرسم.

1- من وقتی یه متغیر رو مثلاً []String تعریف می کنم، اصولی ترین راه از بین بردنش چیه؟
وقتی کارم باهاش تموم شد، مساری null بکنم؟ یا روش بهتری هم هست؟



خوب یه روش همین هست که null کنین تا GC بیاد پاک کنه. توی این حالت با دو بار عبور کردن GC پاک میشه. اگه null نکنین هم خود به خود وقتی می بینه استفاده نمی کنین پاکش می کنه اما توی سیکلهای بیشتری. روش دیگه هم overload کردن متد finalize هست که خود MSDN گفته که بهتره از این روش استفاده نکنین اگه خیلی ضروری نیست چون دیرتر از حافظه پاک میشه. متد finalize خود به خود هیچ کاری انجام نمیده در واقع!



2- من به []Byte دارم که طولانیه و 2 - 3 بار توش این نوشته شده "salam"
(الیته توجه دارید که، هر حرف در یک درایه اش)

من این رو چجوری می تونم splitش کنم؟
که به 3 - 4 قسمت تقسیم سه و اون salam بشه delimiterش؟

راه تعریف شده داره؟ یا باید خودم بنویسم؟


کلاس String یه متد Split داره که 6 تا هم overload داره این تابع. می تونین به شکلهای مختلف رشته رو split کنین. حتی می تونین چند تا رشته رو به عنوان delimiter براش معرفی کنین که توی این حالت باید از این overload استفاده کنین.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

seperator یک آرایه رشته ای هست و option یک متغیر از نوع StringSplitOptions که می تونه دو نوع None و RemoveEmptyEntries که فکر نکنم نیاز به توضیح داشته باشن اینها. overload های دیگه ش رو هم می تونین توی msdn ببینین. تقریبا شبیه همین هستن.

dogtag
04-04-2009, 00:42
برای اولی مرسی.

ولی به دومی توجه نکردید.
من نگفتم string گفتم []Byte

_H2_
04-04-2009, 01:09
سلام
من برای سوالات دوستمف یکسری جواب داشتم تایپ میکردم، و حالا که امدن بفرستم، دیم کاربر mehdi لطف کردند و جوابی داده اند ....
خلاصه دیگر حال ویرایش مجدد ندارم :11: ! متن زیر را میفرستم، با این توجه که در زمان تایپ پست mehdi را ندیده بودم.

==============


ولی این بخش دوم خیلی گویا نبود.
میشه example-oriented عمل کنید؟

خیلی واضح که بود ! ! ! ! !

یکم مثال بهتری میزنم، مثلاً به کد زیر دقت کنید...

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
شما میخواهید NewMethod2 را اجرا کنید،
اگر NewMethod2 را از ریسمان های غیر مجاز اجرا کنید با خطای Cross مواجه میشود،
ولی اگر NewMethod را از هر ریسمانی اجرا کنید، فرقی ندارد و بدون مشکل همان دستورات NewMethod2 در نهایت اجرا خواهد شد.

یادآوری میکنم که m_controlvariant میتوانید هر کنترلری از ریسمان مورد نظر باشد، حتی از یک فرم دیگر و یا خود یک فرم و...

این الگوریتم را باید درک کنید و با تغییرات لازم استفاده کنید.

==============



1- من وقتی یه متغیر رو مثلاً []String تعریف می کنم، اصولی ترین راه از بین بردنش چیه؟
وقتی کارم باهاش تموم شد، مساری null بکنم؟ یا روش بهتری هم هست؟

از شنیدن برخی دستورات و دقتی که فرد پرسنده دارد، آدم خوشحال میشود و این از همان موارد است !

اصولاً نیاز به اجرای دستور خاصی نیست و همان null کافی است، ضمن اینکه null هم در زمانی که خروج از حوزه دید رخ میدهد خودکار انجام میشود و مهم نیست.

مثلاً این null کردن بیهوده است و معنی ندارد !
طبیعتاً با رسیدن به انتهای T1 متغییرها از حوزه کاری خارج میشوند و به نوعی خودکار مرجعشان نابود و از مراجع شی کسر میشود (مشابه همان عمل null)

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در واقع وقتی هیچ متغییری در برنامه وجود نداشته باشد که به محل یک شی کلاس در RAM اشاره کند و از آن استفاده کند، جمع آورنده حافظه هرز آن شی را تحویل میگیرد و آزاد میکند.

البته اگر حافظه مورد نظر زیاد است و اصرار هم دارید که زودتر آزاد شود (دیگر خیلی وسواس هستید !) میتوانید متد System.GC.SuppressFinalize را هم اجرا کنید.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

ولی در کل نیازی به این کارها نیست و در مورد اشایی که واسط IDisposable را ندارد، مسئولی برای نابود سازی بر عهده شما نیست و میتوانید به garbage اعتماد کنید.

==============



من به []Byte دارم که طولانیه و 2 - 3 بار توش این نوشته شده "salam"
(الیته توجه دارید که، هر حرف در یک درایه اش)

من این رو چجوری می تونم splitش کنم؟
که به 3 - 4 قسمت تقسیم سه و اون salam بشه delimiterش؟

راه تعریف شده داره؟

من دستور و متد آماده ای برای این کار نمیشناسم.

اگر واقعاً محتویات آرایه []byte شما متنی است پیشنهاد میکنم تجدید نظری کنید.
دیگر Ascii فرمت چندان رایجی نیست و فرمت های Unicode و مخصوصاً UTF8 رایجتر است...
دات نت حدود 6 فرمت مختلف را با کمک کلاس System.Text.Encoding پشتیبانی میکند.
این فرمتها دیگر سادگی آن یک به یکی Ascii را شاید نداشته باشند و بهتر است تبدیلات []byte به/از []char و string را به عهده دات نت بگذارید.

نگه داری اطلاعات به صورت []char و string ضمن پشتیبانی کامل Unicode و تمام فرهنگ ها و متون به شما این امکانات را میدهد تا از توابع رشته ای دات نت در خصوص کار پردازش متنی خود کمک بگیرید.

مثلاً کلاس string چندین متد آماده Split دارد.
و در واقع کلاس string معادل []char است.

در کل بهتر است از ساختارهای string و []char و System.Text.StringBuilder و System.Text.Encoding برای پردازش متن استفاده کنید.

==============



اگر برای Generic List از نوع byte هم بشه، باز هم خوبه
راستی، در کل استفاده از Generic List روش خوبیه؟

مشکل خاصی ندارد !
البته باید بدانید که کلاسی مثل System.Collections.Generic.List چیبز خاص و خارق العاده و استثنایی ندارد.
کد خود این کلاسها با خود دات نت و همین کلمات کلیدی و امکانات نوشته شده ...
همین کلاس در واقع ...

- اطلاعات را در یک آرایه معمولی نگه میدارد.

- یک آرایه که معمولاً کمی بزرگتر است و در انتهایش عناصر خالی ای برای Add و Insert های بعدی دارد.

- اگر طی عمل Insert و Add آرایه گنجایش کافی و جای خالی بیشتری نداشته باشد، کلاس آرایه ای جدید با ابعاد دو برابر میسازد و عناصر آرایه قبلی را در آرایه جدید بزرگتر با جای خالی بیشتر کپی میکند و آرایه قبلی را رها میکند.

- اگر عمل Add باشد، عنصر جدید به اولین جای خالی آرایه در انتهای آن اضافه میشود.

- اگر عمل Insert در وسط آرایه باشد، عناصر آرایه از آن محل یک واحد به سمت آخر حرکت داده میشوند تا جایی خالی در وسط ایجاد شود.

- اگر عمل Delete باشد، در واقع عناصر از اخر به محل مورد یک واحد حرکت داده میشوند تا نقطه مورد نظر را پر کنند.

خلاصه این مکانیزم کار کلاس فوق بود، حالا میتوانید راجب استفاده ان تصمیم بگیرید.
طبیعتاً ...
- سرعت خیلی کمتری از آرایه مستقیم دارد
- سرعت Add خوبی دارد، مخصوصاً که capacity زیادی داشته باشد.
- سرعت Insert و Delete کم است و نیازمند حرکت عناصر است.

البته الگوریتم و روش فوق در خصوص اغلب collection ها صادق است (بجز نوع Linked که الگوریتم دیگری دارند.)
و البته از بین Collection های دات نت System.Collections.Generic.List یکی از بهترین و پراستفاده ترین آنها است.
که کد نهایی شما فقط و فقط یک لایه با منبع پایه ای اصلی ذخیره اطلاعات در RAM (که همان آرایه باشد) فاصله پیدا میکند.


و همانطور که آرایه پایه نگه داری اطلاعات در System.Collections.Generic.List و System.Collections.List است.
پایه نگه داری اطلاعات در خیلی از کلاسهای سطح بالاتر دات نت همین دو کلاس فوق است.
(مثلاً وقتی نام فایلها یک پوشه را با GetFiles میگیرد، کدهای داخلی برای ذخیره موقت نام ها و اسکن (پیمایش) تمام نامها تا انتها از System.Collections.Generic.List استفاده میکنند و...)

دیگر تصمیم استفاده با در نظر گرفتن شرایط خودتان و شرایط کلاس فوق به عهده خودتان است. !

dogtag
04-04-2009, 01:22
قربان شما.

مستفیض شدیم. (اگر املاش غلط نباشه!)

--

اون پست 5 ه، مشکل نداره؟ (من سرم درد می گیره وقتی نگاهش می کنم :دی)

_H2_
04-04-2009, 01:23
سلام

برای راه دوم، این رو نوشتممن برخی اوقات ادم تنبلی میشوم !
ترجیح میدهم یک کد مطمئن را خودم بنویسم و خیالم راحت باشد !

البته شاید اگر کس دیگری بود چندان حال نوشتن نداشتم ولی ...
خلاصه من کدی شبیه این را پیشنهاد میکنم که البته خیلی سریع نوشتم ولی گمانم بد نباشد و دقیق عمل کند.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

- متد Clone یک کپی جدید تهیه میکند و نتیجتاً تضمین میکند که عناصر مقدار بازگشتی خروجی به یک محل مشترک اشاره نمیکنند و با تغییر فلان عنصر، عنصری در جای دیگر تغییر نمیکند...
امنیدوارم متوجه شده باشید.

- کد فوق آرایه هایی تولید میکند که جمع هعمه انها به اندازه بافر اولیه ورودی خواهد بود.
در صورت امکان و اگر کدتان اجازه میدهد، پیشنهاد میکنم که به جای [][]byte که فرآیندی پرهزینه میطلبد، یک []int بازگردانید که شامل ایندکس نقاط شکست باشد...
طبیعتاً با این کار از تخصیص و مصرف بیشتر RAM در سایزهای زیاد بافر پیشگیری میشود و فقط یک لیست کوچک تر ایندکسی تولید میشود که استفاده از ان هم چندان مشکل نیست...
البته باید شرایط سایز بافر ورودی و قطعات separator را هم در نظر بگیرید، چون احتمال دارد در شرایط خاص این آرایه ایندکسی بزرگتر از [][]byte شود !!!

- گمانم کد فوق مشکلی ندارد ولی باید در شرایط و ورودی های مختلف، خودتان تستش کنید. (من تست نکردم)

موفق باشید.

dogtag
04-04-2009, 02:02
مرسی استاد.
ولی اون deleteseparator اگر true باشد، باید اون آقای separator باید به ابتدای آرایه ی بعدی اضافه شود.

اگر میشه دوباره بنویسید. {شرمنده}

+

مرسی

_H2_
04-04-2009, 02:18
سلام مجدد !

اگر برای Generic List از نوع byte هم بشه، باز هم خوبه
ساعت 3 نصقه شب چیزی یادم امد که حیفم امد نگویم !
در مورد byte اگر قصد دارید، فقط مجموعه ای با متد Add داشته باشید ...
یعنی یکسری بایت را به انتهای بافری اضافه کنید، احتمالاً بهترین گزینه System.IO.MemoryStream خواهد بود.

موفق باشید و شب خوش !

_H2_
04-04-2009, 02:22
سلام

ولی اون deleteseparator اگر true باشد، باید اون آقای separator باید به ابتدای آرایه ی بعدی اضافه شود.
درست متوجه نشدم؟! یکم مشکوک است ! یعنی میخواستید separator مجزا در خروجی نیاید؟

dogtag
04-04-2009, 02:22
شب شما به خیر.

نکته جالبی بود.

--

آخرین سوال امشب »

می خوام به یه سایتی، یه چیزی رو بفرستم و نتیجه رو نشون بدم.

کدام را توصیه می کنید؟
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] یا WebClient؟

چرا؟

مرسی

dogtag
04-04-2009, 02:24
درست متوجه نشدم؟! یکم مشکوک است ! یعنی میخواستید separator مجزا در خروجی نیاید؟

بله! :46:

---------

eAmin
04-04-2009, 11:14
شب شما به خیر.

نکته جالبی بود.

--

آخرین سوال امشب »

می خوام به یه سایتی، یه چیزی رو بفرستم و نتیجه رو نشون بدم.

کدام را توصیه می کنید؟
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] یا WebClient؟

چرا؟

مرسی
سلام.

من جرات نمی کنم جلوی استادان عزیزی همچون _H2_ حرفی بزنم، ولی از اونجایی که تجربه ای اندک توی این زمینه دارم، گفتم یه چیزی بپرونیم:31:
--------------------

به نظر من بهتره که از [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] استفاده کنی، چون همونطور که از سوالت مشخصه می خوای یه درخواستی رو بفرستی و نتیجه رو نشون بدی، خب WebClient نمی تونه اینجا کمکت کنه چون اون فقط می تونه اطلاعات رو دانلود و به نمایش بزاره و عملا هیچ کنترلی رو درخواستت نداری، ولی در WebRequest بهتر می تونی درخواستهات رو کنترل کنی و تقریبا هر درخواستی رو می تونی از طریقش بفرستی و نتیجه رو به نمایش بزاری.

_H2_
05-04-2009, 10:06
سلام

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] یا WebClient؟
همانطور که دوستم جناب Amin eHelp گفتند، WebRequest یک لایه پایین تر قرار دارد و گزینه های بیشتری را در اختیار شما قرار میدهد
شاید نیاز به sample نداشته باشید ولی به عنوان نمونه میتوانید به تاپیک زیر مراجعه کنید:
forum.p30world.com/showthread.php?t=259640
پست 4 و 8


ولی اون deleteseparator اگر true باشد، باید اون آقای separator باید به ابتدای آرایه ی بعدی اضافه شود.
خوب چیز ساده ای و شاید خودتان هم تا حالا حلش کرده باشید، پیشنهاد میکنم روی همان کد قبلی سعی کنید، خودتان تغییراتی اعمال کنید، خیلی ساده است، سعی کنید، اگر نشد، در خدمت هستم.
(با چند تغییر در متغییرهای int همانطور میشود که خواسته اید !)

جمیعاً موفق و پیروز باشید.