PDA

View Full Version : روش اجراي ماژول در زمان اجرا



developer_rahimi
جمعه 12 تیر 1388, 14:33 عصر
دوستان سلام
من ميخوام به برنامه اي كه نوشتم بتونه د شرايط مختلف ماژولهاي مختلفي اجرا كنه. ببينيد يه برنامه مينويسيد و ميفروشيد حالا توي پشتيباني مثلا ماژولي بعنوان حقوق و دستمزد و يكي از مشترياتون درخواست ميكنه. تو VB.NET چطوري ميتونيد برنامه رو طراحي كنيد كه بتونه ماژول مورد نظرو اجرا كنه بدون اينكه exe جديد واسش بفرستيد. مثلا توي دلفي فايلهاي bpl موقع اجرا شدن برنامه load ميشن بنابراين خيلي راحت توي پشتيباني نرم افزار ميشه توانائيهاي مختلفيو با توجه به پولي كه مشتري ميده به برنامه اضافه كنيد درحاليكه همه مشترياتون از يه فايل exe استفاده ميكنن. مثل برنامه همكاران. خيلي دنبالش گشتم ولي پيدا نكردم. كسي روش اين كارو بلده؟

__H2__
یک شنبه 14 تیر 1388, 18:48 عصر
سلام
اگر بخشهای افزودنی شما با یک زبان دات نتی طراحی شده اند، انجام این کار بسیار بسیار ساده است
برای مثال نگاهی به تاپیک زیر بیاندازید:
http://barnamenevis.org/forum/showthread.php?t=154657

developer_rahimi
دوشنبه 15 تیر 1388, 15:17 عصر
مرسي دوست خيلي محترم من
اطلاعات خوبي گذاشته بودي. اتفاقا منم مشكلاتم شبيه مشكلات همون دوستمونه من يه برنامه نويسم و خيلي تو اين زمينه كار كردم ولي خوب همه چيز را همگان دانند من هم به اطلاعات همه دوستان احترام قائلم و ممنونم از درك و فهم دوستاني كه مشاركت ميكنند و بعبارت ديگه ركات العلم نشره.
لطف كن اگه وقت داري يه نگاه به مشخصات برنامه من بتوي سايت http://www.gesmic.ir بندازي و نظرتو بهم بگي اگه امكانش هم واستون بود بيشتر راهنمائي بفرمائيد. فكر ميكنم با ديدن سايت و خوندن پست بنده، كاملا متوجه نياز و منظور بنده ميشيد. بهر حال نهايت سپاسگذاريمو خدمتتون اعلام ميكنم و خداقوت

__H2__
دوشنبه 15 تیر 1388, 21:51 عصر
سلام
چند روز فرصت دهید، تا وقت خالی مناسبی پیدا کنم یک سمپل که مشکل شما و آن تاپیک را حل کند برایتان آپلود میکنم.

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

developer_rahimi
سه شنبه 16 تیر 1388, 08:37 صبح
ممنونم اگه توي سمپلتون يه فرمو بتونيد مثال بزنيد ممنون ميشم چون درنهايت ماژولهائي كه بايد در زمان اجرا بصورت مجزا و از بيرون exe اصلي فراخواني و الحاق بشن معمولا داراي چندين فرم هستند و خودشون مثل يه پروژه مجزا ميمونن. اگه تو vb.net مثال بزنيد خيلي عالي ميشه. سپاسگذارم

__H2__
چهارشنبه 17 تیر 1388, 12:52 عصر
سلام
یک نمونه کدی نوشتم که دو بخش تقریباً مجزا دارد ...
کد جاری یک exe دارد که با vb.net طراحی شده و سه افزونه یا plug-in یا add-on و... دارد که هر کدام با vb.net و c#.net و vc++.net طراحی شده اند و dll هستند!

برنامه exe وقت بالا آمدن پوشه Plugins در کنار exe را جستجو میکند و تمام dll هایی که یکی از قوانین Sample1 یا Sample2 را پیاده سازی کرده باشد پیدا کرده و لیست میکند.

(
بعد از باز کردن پروژه در داخل VS و کامپایل کلی، فایل کوچک و بزرگ در پوشه EXE ساخته میشود
ولی اگر قبل از هر باز کردنی در VS به پوشه مذکور بروید خواهید دید که بودن فقط فایل اصلی exe و dll ها در Plugins کافی است و شما هم میتوانید سایر فایلها را حذف کنید،
یکبار قبل از باز کردن در VS پوشه EXE را ببینید
)

همانطور که خواهید دید پلاگین ها میتوانند با هر زبان دات نتی طراحی شوند و فقط با کپی شدن در پوشه Plugins شناسایی میشوند و exe آنها را پیدا کرده و بار گذاری میکند

Sample1 بر اساس dll هایی است که یک کنترلر System.Windows.Forms.Control در خود داشته باشند
در نتیجه بدیهی است که پروژه های پلاگینهای Sample1 باید فایل System.Windows.Forms را reference کنند تا بتوانید از کلاس مذکور استفاده کنید.
(بیشتر مربوط به مبحث این تاپیک (http://barnamenevis.org/forum/showthread.php?t=154657))

Sample2 بر اساس dll هایی است که واسط IPlugin درون پروژه exe را در خود پیاده سازی کرده باشند.
در نتیجه بدیهی است که پروژه های پلاگینهای Sample2 باید فایل ExePlugin را reference کنند تا بتوانند از رابط مذکور استفاده کنند.
(بیشتر مربوط به مبحث همین تاپیک فعلی و جاری)

شما هم میتوانید به سادگی یک پروژه Dll با هر زبان دات نتی شروع کنید و یک usercontrol در ان قرار دهید و پس از کامپایل dll نهایی را به پوشه Plugins کپی کنید، خواهید دید که با اجرای exe ، برنامه ان را پیدا کرده و میشناسد و میتواند انرا نمایش دهد.

لینک دانلود ثابت:
http://support.h02.ir/fwlink/?LinkId=1005796407

موفق باشید.

developer_rahimi
چهارشنبه 17 تیر 1388, 15:32 عصر
خيلي عالي بود دوست من سپاسگذارم. كد نويسي خوبي داري ولي من هنوز مشكلم حل نشده. ببين يه ماژول كه ميخواي به يه برنامه كاربردي اضافه كني ممكنه از تعداد زيادي فرم تشكيل شده باشه و همينطور هركدوم از اين فرمها ممكنه از داخل كدهاي چندين فرم ديگه صدا زده بشن. اين خيلي مشكله. چرا؟ چون بايد يه يه پروژه user control شروع بكني بعد همه اون فرمها كه مورد نظرته بعلاوه تمام كدهاشو اون تو بنويسي بعد كامپايل كني تا يه dll درست بشه بعد اونو بفرستي واسه مشتري و برنامت اونو بخونه. درست فهميدم؟ اگه اينطور باشه با توجه به مشكلاتي كه توي باگ گيري و تريس class library ها هست ميدوني چقدر وقت گير و طاقت فرسا ميشه؟
راه حلي نداريم كه بتونيم از يه پروژه windows app يه dll بگيريم بدون اون مشكلات؟
درهر حال مطلبت فوق العاده بود به گفته آقا علي از حالا اميدوارم بتونم كارتو جبران كنم. ممنونم از اينكه وقت گذاشتي
يه نظر راجع به كار من بدي ممنونت ميشم لينكشو قبلا واست گذاشتم.
اينكه توي اين پروژم خيلي تكنيكال اين قسمتو انجام بدم واسم فوق العاده مهمه. چه كنم كه ديگه پير شدم شايدم بيرون اومدن از روشهاي سنتي واسه من كمي دير باشه

__H2__
پنج شنبه 18 تیر 1388, 01:50 صبح
سلام
دوست من مشکل شما اینجا است که به جای متوجه شدن کد سعی میکنید هین را copy و paste کنید...
اصلاً بحث Control و Iplugin مطرح نیست!
بحث سر این است که چطور بتوانیم بر کلاسها و ابزار موجود در سایر dll ها به صورت runtime در برنامه خودمان استفاده کنیم.

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


... چون بايد يه يه پروژه user control شروع بكني ...
اصلاً بحث usercontrol نیست، میتواند هر کلاسی باشد ...
شما میتوانید به جای control های داخل یک dll از form های داخل یک dll استفاده کنید، این مهم نیست.

ولی عالی ترین و کاملترین شکل همان واسط است
همین واسط ساده IPlugin را در نظر بگیرد یکگ متد Run دارد که object ای میگیرد object ای پس میدهد...
گرچه در این کدها ما فقط به برگشت یک string اکتفا کرده ایم ولی این یک نماد بزرگ است که باید درکش کنید!!!

شما میتوانید هر کدی را در متد Run آن dll اجرا کنید، محدودیتی وجود ندارد...

این متد میتوانید یک کلاس و منبع سرویس عمومی را بگیرد که مثلاً شامل اشاره گر فرم mdi و یا connectionstring ویثژه برنامه باشد و... و سپس میتواند در رویه داخلی خود اقدام به نمایش و مدیریت چندین فرم کند...

مثلاً برنامه exe در زمان بالا آمدن به جای لیست کردن این افزونه به یک listbox آنها را به انتهای منویی به نام "ابزار" اضافه کند و کاربر با کلیک منوی مربوطه متد Run آن پلاگین را اجرا کند ... این انتقال خط اجرای ریسمان است و سپس میتواند در متد run هر کدی برای نمایش هر فرمی نوشت

تازه واسط نمادینت و ساده ای که من معرفی کردم فقط یک Name و Run داشت!!! شما میتوانید انواع عنصاصر دیگر را به ان اضافه کنید.

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


... با توجه به مشكلاتي كه توي باگ گيري و تريس class library ها هست ...
من واقعاً نمیدانم شما از چه مشکلاتی سخن میگویید!!!!!
مشکل دیباگ dll ان هم در vs2008 !!!!!!! بدون شک در زمان طراحی درست عمل نمیکنید.

- لطفا همین الآن این را در همین پروژه ای که من آپلود کردمم تست کنید...
- مثلاً به پروژه CSSamplePlugin بروید و فایل Sample2.cs را باز کنید...
- روی دستور ;"return "C#.Net - Sample2 - Mahdi یک بار F9 بزنید تا سیاه شود.
- پروژه را در حالت Debug اجرا کنید و سعی کنید در برنامه exe و درون listbox اش آیتم C#.Net - Sample2 را دبل کلیک کنید.
- خواهید دید که با وجودی که شما پروزه exe به زبان VB.Net را اجرا کرده اید VS فوراً به حالت دیباگ برای پروزه dll که با #C نوشته شده میرود ...
- اصلاً نه انگار که اینها دو پروژه exe و dll جدا هستند و بدتر از ان هر کدام با یک زبان دات نتی نوشته شده اند!!!
- شما یک مورد را در همین پک یک دست 4 پروزه ای فوق که من آپلود کردم ذکر کنید که برای دیباگ ان سه dll باید کاری متفاوت از دیباگ ان یک exe انجام دهید.

این از محسنات بسیار بزرگ VS است که امکانات دیباگ بسیار بسیار پیشرفته ای ارائه میکند.
دقت بیشتری کنید، و به جای reference کردن نسخه های کامپایل شده dll ها، پروژه های انها را reference کنید، متوجه میشوید مشکل خاصی در این خصوص وجود ندارد.

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

یک نکته دیگر هم مهم است که بگویم ...
من برای سادگی و شفافیت بیشتر کدها واسط IPlugin را در داخل خود exe تعریف کردم ولی این به دلایل مختلف کار مطلوبی نیست ...
بهتر است یک پروزه dll (حتی اگر شده خیلی کوچک) برای این منظور ایجاد کنید و واسط مذکور را به خوبی و طوری که جوابگوی نیازهای آینده هم باشد در این dll تعریف کنید و سعی کنید dll مذکور را به این راحتی ها دستکاری نکنید..
این میتواند شمانتی باشد برای کارکرد صحیح پلاگین های مختلف با اختلاف زمانی مختلف در نسخه های مختلف محصولات شما ...



يه نظر راجع به كار من بدي ممنونت ميشم لينكشو قبلا واست گذاشتم
نمیدانم چه نظری باید بدهم! این هم یک برنامه است مثل بقیه برنامه ها ...
ولی در مورد زیر میتوانم چیزی بگویم...

اينكه توي اين پروژم خيلي تكنيكال اين قسمتو انجام بدم واسم فوق العاده مهمه. چه كنم كه ديگه پير شدم شايدم بيرون اومدن از روشهاي سنتي واسه من كمي دير باشه
دوست عزیز ...
اگر احساس میکنید که پروژه تان پیچیده شده و دارید سردرد میگیرد و نمیتوانید تمام بخشها را به هم مرتبط کنید و هر جایی را درست میکنید جای دیگری ایراد پیدا میکند و... فقط دو حالت دارد!

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

مثلاً هر کجا خواستید به دیتابیس وصل شده اید ...
بارها کدهای خود را copy و paste کرده اید ...
در محل هر مشکل فقط به فکر حل هر چه زودتر مشکل با هر کدی بوده اید ...
با تغییر هر بخش کد و یا دیتابیس مجبور میشود کل کدها را جستجو کنید تا کدهای وابسته را هم اصلاح کنید ...

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

موفق باشید.

developer_rahimi
پنج شنبه 18 تیر 1388, 09:47 صبح
سلام
آقا من كه تشكر كردم از شما ولي ظاهرا سئوالهاي ما شما رو خيلي ناراحت و كرده. البته من از نسخه 2005 استفاده ميكنم به هر حال من تونستم با توجه به راهنمائيهاي شما كارو انجام بدم ولي شايد مطلبو خوب نرسوندم اشكالي كه وجود داره اينهكه تا زمانيكه از كامپوننتها استفاده نكردم و از كنترلهاي خود vs استفاده ميكنم جواب ميگيرم ولي همينكه از كامپوننتهاي ديگه استفاده ميكنم پيغام خطا ميده. براي نمونه از كنترلهاي جانوس كه استفاده ميكني ديگه كار نميكنه ؟؟؟؟!!!!! نفهميدم چرا؟
من كارمو ضميمه كردم اگه جانوسو داشته باشيد ميبينيد. جدول مورد استفاده هم هرچي خواستيد بذاريد. dllشو تو همون فولدر پلاگين خودتون بريزيد نتيجه معلوم ميشه. اگه از رو پروژه من گروپ باكس جانوسو برداريد، كار مينه اگه بذاريد خراب ميشه

__H2__
پنج شنبه 18 تیر 1388, 23:25 عصر
سلام

ولي ظاهرا سئوالهاي ما شما رو خيلي ناراحت و كرده
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
نمیدانم یا من بد نوشتم یا شما بد متوجه شدید!!!!!!!!
کسی که از سوال پرسیدن ناراحت نمیشود!!!!!!!!!!!!!!!

گمانم کسی اگر بخواهد از سوال و مطرح کردن مشکل دیگران ناراحت شود حداقل حداقلش آن است که در این تالارهای گفتگو فعالیت نمیکند، چون این تالارها سرشار از از سوال و مشکل و تردید و بحث و تحلیل و... است!

من فقط طبق گفتار معمولم سعی کردم به سوالات و مشکلات احتمالیتان پاسخ مناسبی بدهم، چیزی که طبیعی است آن است که اینجا فقط متن وجود دارد و لحن گفتار مشخص نمیشود ...
خیالتان راحت، شما تا 50 هزار سال آینده(!) هم سوال بپرسید و ابهامی مطرح کنید من یکی ناراحت نمیشوم و تاجایی که سواد و وقتم اجازه دهد سعی میکنم کمکتان کنم...

شاید مثلاً از جمله زیر برداشت خوبی نکردید؟؟

- شما یک مورد را در همین پک یک دست 4 پروزه ای فوق که من آپلود کردم ذکر کنید که برای دیباگ ان سه dll باید کاری متفاوت از دیباگ ان یک exe انجام دهید.

اگر اینچنین است باید عرض کنم که این جمله ای معمولی برای تشویق شما به تست و یافتن مشکل احتمالی در دیباگ بوده و همانطور که در ادامه اش ذکر کردم گمانم مشکل دیباگ شما در dll ها ناشی از reference کردن خود dll های نهایی است وگرنه اگر پروژه dll را reference کنید خواهید دید که مثل همین پروزه بسیار بسیار ساده و درپیتی که من آپلود کردم، مشکلی با دیباگ dll نخواهید داشت.

همچنان هم اگر حس میکنید مشکلی با دیباگ dll ها دارید ان را مطرح کنید، یکبار هم این مشکلتان را با همین پروزه درپیت فوق تست کنتید و ببینید آنجا هم همین مشکل دیباگ را دارید یا نه؟

فقط میخواستم متوجه شوید که مشکلی به نام دیباگ dll در vs وجود ندارد و اگر شما مشکلی دارید باید مشتاق باشید آن را هم مثل سوالات معمولی در تاپیکی مطرح کنید تا دوستان جوابتان را بدهند نه اینکه این مشکل را پیش خود نگه دارید و سالها اصلاً هم دنبال راه حلش نروید ... !

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


براي نمونه از كنترلهاي جانوس كه استفاده ميكني ديگه كار نميكنه ؟؟؟؟!!!!! نفهميدم چرا؟
شخصاً از این جور چیزها استفاده نمیکنم، ولی حتماً بررسی میکنم و جواب میدهم.
ولی ندیده به احتمال 98 درصد مشکل شما ناشی از dependency و بحث امنیت در دات نت میشود.

dll هایی که به این طریق و runtime بارگذاری میشوند نمیتوانند dll های reference شده خودشان را پیدا کنند و این وظیفه شما است که تمام وابستگی های انها را در کدتان تامین کنید.

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

موفق و پیروز و سربلند باشید.

__H2__
جمعه 19 تیر 1388, 03:32 صبح
سلام

براي نمونه از كنترلهاي جانوس كه استفاده ميكني ديگه كار نميكنه ؟؟؟؟!!!!! نفهميدم چرا؟
کافی است شما دو dll اصلی Janus را کنار exe برنامه کپی کنید و مجدداً تست کنید، مشکل حل میشود.

developer_rahimi
جمعه 19 تیر 1388, 13:36 عصر
من علاوه بر dll كامپايل شده همه فايلهائي كه در پوشه bin بوجود ميادو كپي كردم تو پوشه پلاگين. كلا كدهاتون خيلي روان و خوب نوشته شده موضوع اصلي دستگسرم شد ولي وقتي از كامپوننتها استفاده ميكنم كار نميكنه حتي عرض كردم كليه فايلهائي كه بعد از كامپايل توي فولدر bin درست ميشه رو باهم كپي كردم توي پلاگين ولي همچنان مشكل وجود داره و error ميده
بازهم سعي ميكنم به نتيجه برسم

__H2__
جمعه 19 تیر 1388, 14:32 عصر
سلام
شما هم احتمالاً همان مشکل آن تاپیک دیگر را پیدا کردید ...
فایلهای dll را که برای plugin خود reference کرده اید و در bin وجود دارد در کنار exe کپی کنید نه در پوشه Plugins !!!
فقط dll را که میخواهید به برنامه اضافه شود در Plugins وارد کنید.
=====
البته میتوانید const موجود در برنامه را هم تغییر دهید تا کلاً exe به جای پوشه plugins همه فایلهای کنار خود را جستجو کند.

developer_rahimi
جمعه 19 تیر 1388, 14:58 عصر
دقيقا فرمايش شما درست بود.
بينهايت سپاسگذارم. من به نتيجه نهائي رسيدم و شروع ميكنم به تحليل كدهاي شما و ساخت يه كلاس عمومي براي استفاده در برنامه اي مختلف. اميدوارم روزي بتونم زحمات شما رو جبران كنم.
اگه خدمتي از بنده بربياد حتما براتون انجام خواهم داد
به شكرانه مطلب خوبي كه ازتون ياد گرفت شروع ميكنم به آموزش VB.NET از صفر تا دوستانيكه تازه ميخوان برنامه نويسي شروع كنن از يه تاپيك استفاده كنند

a59ir
سه شنبه 14 مهر 1388, 10:37 صبح
شما هم احتمالاً همان مشکل آن تاپیک دیگر را پیدا کردید ...
فایلهای dll را که برای plugin خود reference کرده اید و در bin وجود دارد در کنار exe کپی کنید نه در پوشه Plugins !!!
فقط dll را که میخواهید به برنامه اضافه شود در Plugins وارد کنید.


------------

با سلام
ممنون از راهنماییهاتون
ولی دقیقا مشکل من همین جاست . همیشه امکان این نیست که dll های مربوط به plugin را در کنار exe کپی کرد . شاید دو plugin مختلف دو dll همنام داشته باشند و ... . راهی هست که dll های مربوط به plugin در کنار خود plugin باشند . مثلا با AddPrivateBinBath , ... .
من راههای مختلف رو تست کردم و به نتیجه ای نرسیدم

a59ir
سه شنبه 14 مهر 1388, 15:38 عصر
با سلام
ممنون از راهنماییهاتون
ولی دقیقا مشکل من همین جاست . همیشه امکان این نیست که dll های مربوط به plugin را در کنار exe کپی کرد . شاید دو plugin مختلف دو dll همنام داشته باشند و ... . راهی هست که dll های مربوط به plugin در کنار خود plugin باشند . مثلا با AddPrivateBinBath , ... .
من راههای مختلف رو تست کردم و به نتیجه ای نرسیدم

__H2__
پنج شنبه 16 مهر 1388, 12:20 عصر
سلام


همیشه امکان این نیست که dll های مربوط به plugin را در کنار exe کپی کرد

در بیشتر مواقع پلاگین نرم افزاری تک فایلهایی هستند با پسوند غیر مرسوم و غیر dll ... ولی خیلی موارد ذاتاً dll هستند.
در حالات عادی پلاگین باید فقط از dll های خود برنامه استفاده کند.



راهی هست که dll های مربوط به plugin در کنار خود plugin باشند

احتمالاً اگر dll های کنار پلاگین را که خودشان پلاگین نیستند اول بارگذاری کنید و به یک System.Security.Policy.Evidence اضافه کنید مشکلتان حل خواهد شد.
(متغییر evidence در همین کدهای سمپل نمونه که گذاشتم.)