تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 1 از 2 12 آخرآخر
نمايش نتايج 1 به 10 از 17

نام تاپيک: Close Source کردن DLL م + Cross-Thread

  1. #1
    حـــــرفـه ای dogtag's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    مرز غربی تهران بزرگ! ایمیل: goodboy.php@gmail.com اسپم ها: 2,200!!! :دی
    پست ها
    2,277

    7 Close Source کردن DLL م + Cross-Thread

    سلام علیکم.
    من هنوز رو همون namespace و کلاس های حودمم. () [نمیشه 1 تاپیک واسه همه ی سوالام داشته باشم؟]

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

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

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

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

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

    =====

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

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

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

    =====

    همین دیگه.

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

  2. #2
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

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

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

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

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

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

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

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

  3. #3
    حـــــرفـه ای dogtag's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    مرز غربی تهران بزرگ! ایمیل: goodboy.php@gmail.com اسپم ها: 2,200!!! :دی
    پست ها
    2,277

    پيش فرض

    ممنون.

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

    مرسی

  4. #4
    حـــــرفـه ای dogtag's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    مرز غربی تهران بزرگ! ایمیل: goodboy.php@gmail.com اسپم ها: 2,200!!! :دی
    پست ها
    2,277

    پيش فرض

    2 تا سوال دیگه هم پیش اومده که بذارید بپرسم.

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


    -----

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

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

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

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

    مرسی

  5. #5
    حـــــرفـه ای dogtag's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    مرز غربی تهران بزرگ! ایمیل: goodboy.php@gmail.com اسپم ها: 2,200!!! :دی
    پست ها
    2,277

    پيش فرض

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


    --


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

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

    منتظرم

  6. #6
    حـــــرفـه ای M E H D I's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    خونمون
    پست ها
    2,606

    پيش فرض

    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 ببینین. تقریبا شبیه همین هستن.

  7. #7
    حـــــرفـه ای dogtag's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    مرز غربی تهران بزرگ! ایمیل: goodboy.php@gmail.com اسپم ها: 2,200!!! :دی
    پست ها
    2,277

    پيش فرض

    برای اولی مرسی.

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

  8. #8
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    من برای سوالات دوستمف یکسری جواب داشتم تایپ میکردم، و حالا که امدن بفرستم، دیم کاربر mehdi لطف کردند و جوابی داده اند ....
    خلاصه دیگر حال ویرایش مجدد ندارم ! متن زیر را میفرستم، با این توجه که در زمان تایپ پست 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 استفاده میکنند و...)

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

  9. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


  10. #9
    حـــــرفـه ای dogtag's Avatar
    تاريخ عضويت
    Aug 2006
    محل سكونت
    مرز غربی تهران بزرگ! ایمیل: goodboy.php@gmail.com اسپم ها: 2,200!!! :دی
    پست ها
    2,277

    پيش فرض

    قربان شما.

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

    --

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

  11. #10
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

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

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

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

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

    موفق باشید.
    Last edited by _H2_; 04-04-2009 at 02:05.

  12. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


صفحه 1 از 2 12 آخرآخر

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

برچسب های این موضوع

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •