PDA

View Full Version : سوال: راهنمايي در مورد چگونگي به روزرساني يك نرم افزار



asefy2008
شنبه 22 فروردین 1388, 14:55 عصر
سلام دوستان مي خوام بدونم چطور يك نرم افزار رو به روزرساني مي كنند؟
اگه لينكي هست لطفا رهنمايي كنيد.
منظورم اين هست كه مثلا ما يه نر افزار مي نويسيم بعد از مدتي تصميم مي گيريم يه قابليت ديگه به اون اضافه كنيم چطور بايد اين كار رو انجام داد؟

pargoo
شنبه 22 فروردین 1388, 17:26 عصر
تا اونجا که من می دونم، برنامه نویسی بهتره به صورت لایه ای یا به هر حال با یه معماری خاصی صورت بگیره. وقتی اینطور باشه، می شه هر قسمت از برنامه رو در فایل های جداگانه ای نوشت و در نهایت به هم ارتباط داد.

با این کار هر قسمت از برنامه که تغییر کرده باشه فقط کافیه اون DLL رو به کاربر داد تا تغییرات براش انجام بشه.

امیدوارم مفید بوده باشه!

محمدامین شریفی
شنبه 22 فروردین 1388, 18:15 عصر
سلام دوستان مي خوام بدونم چطور يك نرم افزار رو به روزرساني مي كنند؟
اگه لينكي هست لطفا رهنمايي كنيد.
منظورم اين هست كه مثلا ما يه نر افزار مي نويسيم بعد از مدتي تصميم مي گيريم يه قابليت ديگه به اون اضافه كنيم چطور بايد اين كار رو انجام داد؟
هنگامی که برنامه ان را publish میکنی.چند گزینه دارد:
major,minor,build,revision
هنگامی که setup را اجرا میکنیم.خودش برنامه نصب شده را update میکند.
اگر هم منظورتان "ویرایش قابلیت های نرم افزار" مانند ویژوال استدیو هست.این مسئله هم کاملا به برنامه نویسی خودتان بستگی دارد و در هنگام ساختن setup میتوانید یک form بسازید و از کاربر نوع نصب را بپرسید.

asefy2008
شنبه 22 فروردین 1388, 18:43 عصر
هنگامی که setup را اجرا میکنیم.خودش برنامه نصب شده را update میکند.
من منظورتون رو متوجه نشدم منظورتون این هست که نرم افزاری که روی سیستم نصب شده رو update میکند.در این صورت اون setup رو چطور باید ایجاد کرد؟
منظورم این هست که شما مثلا برنامه ماشین حساب رو می نویسید در حال حاضر نمی تونه به توان برسونه بعد مدتی تصمیم می گیرید این قابلیت رو به برنامتون اضافه کنید شما تابع مورد نظر رو می نویسید حالا چطور باید این تابع رو به برنامه publish شده اضافه کرد؟

asefy2008
شنبه 22 فروردین 1388, 18:48 عصر
با این کار هر قسمت از برنامه که تغییر کرده باشه فقط کافیه اون DLL رو به کاربر داد تا تغییرات براش انجام بشه.
میشه در این مورد بیشتر توضیح بدید.

asefy2008
چهارشنبه 26 فروردین 1388, 16:20 عصر
کسی نیست راهنمایی کنه؟:ناراحت:

Mehdi Asgari
چهارشنبه 26 فروردین 1388, 16:35 عصر
ببین به دردت می خوره :
http://www.barnamenevis.org/forum/showthread.php?t=155139

NewFoxStudent
چهارشنبه 26 فروردین 1388, 17:02 عصر
میتونید فایل exe جدید رو با فایل exe نصب شده جایگزین کنید
اینکار رو میتونید از طریق یه نرم افزار که خودتون نوشتید انجام بدید
به این صورت که یه فایل exe رو به عنوان پارامتر بگیره و در مسیر مشخصی کپی کنه

asefy2008
چهارشنبه 26 فروردین 1388, 17:25 عصر
ممنون دوستان ولی منظورم این نبود منظورم این هست که شما یک فایلی ایجاد کنید که با کلیک روی اون خود به خود به برنامه قبلیمون اضافه بشه.
با تشکر

seven7777777
چهارشنبه 26 فروردین 1388, 17:38 عصر
در کل باید برنامت پویا باشه یعنی فرم هات مثلا از قبل ساخت شده نباشه یا حداقل متدی برای ساخت فرم پویا داشته باشی .
مثلا تمام فرم هات رو و محتویاتشون رو از یک table بخونی . اینجوری فقط با update بانکت می تونی یه فرم جدید تو برنامت داشته باشی .
برای updte بانکت هم می تونی یه فایل xml که حاوی مشخصات فرمت هست رو به قسمت update برنامت پاس بدی و بعد در اونجا اونو تو دیتابیست ذخیره کنی .

البته حتما راه بهتری هم هست ، نیست ؟؟؟

asefy2008
پنج شنبه 27 فروردین 1388, 15:03 عصر
ممنون دوست عزیز راه حل جالبی بود .:تشویق:
ولی ببینیم دوستان راه حل دیگه ای دارن.

محمدامین شریفی
شنبه 29 فروردین 1388, 22:39 عصر
ممنون دوست عزیز راه حل جالبی بود .:تشویق:
ولی ببینیم دوستان راه حل دیگه ای دارن.
خیلی ممنون از asefy2008 بخاطر مطرح کردن این پرسش واقعا قشنگ و کاربردی.
در این پرسشی که مطرح شد،برنامه نویس برای حل آن باید تا حدودی اصول اولیه #C را بلد باشد.
در زیر 2 ضمیمه برایتان گذاشته ام.اولین ضمینه پروژه C# است و دومین ضمیمه چند DLL میباشد که شما میتوانید با folderBrowser برنامه،آن DLL ها را به پروژه یتان اضافه کنید!!!!!
نام نویسنده پروژه در PDF آموزشی که درون ضمیمه اول وجود دارد،نوشته شده است.بعد از مطالعه کامل PDF آموزشی اگر پرسشی برایتان پیش آمد،میتوانید آنرا مطرح بفرمایید.

من منظورتون رو متوجه نشدم منظورتون این هست که نرم افزاری که روی سیستم نصب شده رو update میکند.در این صورت اون setup رو چطور باید ایجاد کرد؟
منظورم این هست که شما مثلا برنامه ماشین حساب رو می نویسید در حال حاضر نمی تونه به توان برسونه بعد مدتی تصمیم می گیرید این قابلیت رو به برنامتون اضافه کنید شما تابع مورد نظر رو می نویسید حالا چطور باید این تابع رو به برنامه publish شده اضافه کرد؟
اگر به گزینه Updates نرم افزار Installshield یا click-once نظری بیفکنید،متوجه میشوید.

پیروز باشید.

محمدامین شریفی
یک شنبه 30 فروردین 1388, 16:16 عصر
اینم چند منبع مفید:
http://www.codeproject.com/KB/cs/pluginsincsharp.aspx
http://www.codeproject.com/KB/cs/c__plugin_architecture.aspx
دوستان کسی مایل به ادامه کار نیست؟

احمد سامعی
یک شنبه 30 فروردین 1388, 23:05 عصر
من مثال هاي جناب aminsharifi67 دارم دانلود مي كنم هنوز نگاه نكردم
اما قبلاً من همين موضوع رو پرسيده بودم و چون معمولاً اين آپديت از طريق اينترنت انجام مي شه اساتيد گفتن بهترين و ساده ترين راه استفاده از WebService ها است در مورد نحوه اين كار هم بايد مثال ها و لينك هاي جناب aminsharifi67 مطالعه كرد ببينيم آخرش چي مي شه

asefy2008
یک شنبه 30 فروردین 1388, 23:37 عصر
اما قبلاً من همين موضوع رو پرسيده بودم و چون معمولاً اين آپديت از طريق اينترنت انجام مي شه اساتيد گفتن بهترين و ساده ترين راه استفاده از WebService ها است در مورد نحوه اين كار هم بايد مثال ها و لينك هاي جناب aminsharifi67 مطالعه كرد ببينيم آخرش چي مي شه
دوست عزیز اشتباه نکنید ما نمی خوایم از طریق اینترنت آپدیت کنیم (البته اگه بشه شاید در آینده ...) من می خوایم یک فایل exeدر اختیار کاربر قرار بدم

احمد سامعی
دوشنبه 31 فروردین 1388, 12:13 عصر
دوست عزیز اشتباه نکنید ما نمی خوایم از طریق اینترنت آپدیت کنیم (البته اگه بشه شاید در آینده ...) من می خوایم یک فایل exeدر اختیار کاربر قرار بدم

من فقط در تكميل بحث گفتم اگر بخواهيم از اينترنت استفاده كنيم راهش استفاده از webService هست و اگر دقت كرده باشيد گفتم روشش ممكن هر چيزي باشه مثلاً مثالي كه جناب aminsharifi67 گذاشتن باشه، در واقع استفاده از webservice ها نحوه انتقال فايل هايي كه مي خواهيم آپديت بشه از طريق اينترنت به كامپيوتر مقصد هست و اينكه چطوري برنامه آپديت بشه بحث همين پست شما مي شه، كه اميدوارم پس خوبي در نهايت بشه

asefy2008
دوشنبه 31 فروردین 1388, 16:43 عصر
با تشکر از جناب aminsharifi67 اینهام بدنیست:

http://www.informit.com/articles/article.aspx?p=332874
http://www.codeproject.com/KB/cs/dynamicpluginmanager.aspx

محمدامین شریفی
سه شنبه 01 اردیبهشت 1388, 21:08 عصر
به نام نامی که جز او نامی نیست


در اینجا قصد دارم نگاهی به چگونگی اجرای برنامه plug-In ای که در ضمیمه آورده شده است،بیندازیم.
در اینجا کلمات کلیدی #C با رنگ قرمز مشخص میشود.یعنی اگر تابعی به رنگ قرمز نوشته نشده است،بدین معنیست که در داخل برنامه تعریف شده است و جای نگرانی نیست!.
ما در این برنامه 3 پروژه داریم به نام های:


PluginInterface
fave_Plugin
Host

ما در پروژه PluginInterface قالب کلی افزونه هایمان(plug-In) را تعریف میکنیم.و این تنها با تعریف یک interface ای ممکن است که به صورت public تعریف شده باشد،میسر میشود.در این پروژه نیازی به مقدار دهی متغییر ها یا تعریف توابع نیست.به این علت که میخواهیم interface هایی که در این پروژه مینویسیم، در 2 پروژه دیگر به صورت دلخواه استفاده کنیم.به همین دلیل از 2 interface استفده میکنیم:


public interface IPlugin برای استفاده در کلاس Plug-In
public interface IPluginHost برای استفاده در کلاس Host

چیزی که در اینجا لازم به ذکر است،اینست که حتما Header هایی که در PluginInterface تعریف میکنیم.باید در کلاس های مربوطه تعریف(define) بشوند.

در پروژه fave_Plugin (پ.ن:میتواند هر اسم دیگر و به هر تعداد دلخواه از این نوع پروژه در برنامه ایجاد کرد.در حقیقت خروجی این solution یک فایل DLL است.که باید آنرا در قالب یک UserControl ایجاد کرد)
شما مشخصات DLL دلخواهتان را مشخص میکنید.همچنین میتوانید مشخص کنید، که میخواهید از کدام توابعی که در سمت میزبان پشتیبانی میشود(پ.ن:در پروژه Host)، در DLL تان استفاده کنید.مثلا شما میخواهید از تابع calculate استفاده کنید ولی نمیخواهید از تابع paint در DLL تان استفاده کنید.پس به عنوان مثال اینگونه مینویسید:


this.Host.Calulate(20, 10);
قسمت اصلی برنامه، در داخل پروژه Host 2 کلاس تعریف شده است به نام های:


PluginServices.cs
Global.cs

در داخل PluginServices.cs ما توابع زیر را داریم:

نکته:پیش از هر چیز باید بدانید که AvailablePlugins لیستی(collection) ای از AvailablePlugin است.در حقیقت ما بوسیله AvailablePlugin به پیدا کردن Plug-In ها میکنیم.هر موقع که آنها را پیدا کردیم،آنها را به لیست AvailablePlugins اضافه میکنیم و AvailablePlugin را NULL میکنیم.


(public void FindPlugins(string Path :به جستجوی دایرکتری برای یافتن فایلی که در آن شرط

file.Extension.Equals(".dll")) برقرار باشد.هنگامی که این فایل را یافتیم آنرا به لیست AvalablePlugins هایمان اظافه میکنیم.
(private void AddPlugin(string FileName شاید این مهمترین بخش این پروژه باشد، و در حقیقت مهم ترین بخش این برنامه میباشد.به همین دلیل به نوشتن کدهای این تابع میپردازیم:



private void AddPlugin(string FileName)
{
//Create a new assembly from the plugin file we're adding..
Assembly pluginAssembly = Assembly.LoadFrom(FileName);

//Next we'll loop through all the Types found in the assembly
foreach (Type pluginType in pluginAssembly.GetTypes())
{
if (pluginType.IsPublic) //Only look at public types
{
if (!pluginType.IsAbstract) //Only look at non-abstract types
{
//Gets a type object of the interface we need the plugins to match
Type typeInterface = pluginType.GetInterface("PluginInterface.IPlugin", true);

//Make sure the interface we want to use actually exists
if (typeInterface != null)
{
//Create a new available plugin since the type implements the IPlugin interface
Types.AvailablePlugin newPlugin = new Types.AvailablePlugin();

//Set the filename where we found it
newPlugin.AssemblyPath = FileName;

//Create a new instance and store the instance in the collection for later use
//We could change this later on to not load an instance.. we have 2 options
//1- Make one instance, and use it whenever we need it.. it's always there
//2- Don't make an instance, and instead make an instance whenever we use it, then close it
//For now we'll just make an instance of all the plugins
newPlugin.Instance = (IPlugin)Activator.CreateInstance(pluginAssembly.G etType(pluginType.ToString()));
//Set the Plugin's host to this class which inherited IPluginHost
newPlugin.Instance.Host = this;

//Call the initialization sub of the plugin
newPlugin.Instance.Initialize();

//Add the new plugin to our collection here
this.colAvailablePlugins.Add(newPlugin);

//cleanup a bit
newPlugin = null;
}

typeInterface = null; //Mr. Clean
}
}
}

pluginAssembly = null; //more cleanup
}

شاید در نگاه اول این تابع بسیار پیچیده بیاید،ولی اینگونه نیست!.
ما در اینجا به دنبال Type هایی درون فایلمان هستیم که شرط های زیر را داشته باشند
الف)به صورت Public تعریف شده باشند:به این دلیل که بتوانیم از توابع آن استفاده کنیم.
ب)Abstract نشده باشند.
ج)همچنین باید Type مورد نظر از PluginInterface.IPlugin مشتق شده باشد.
هر موقع Type مورد نظر را پیدا کردیم باید یک نمونه از آن ایجاد کنیم(پ.ن:هر گاه DLL را پیدا کردیم،باید یک نمونه از آنرا همراه با نام Assembly معتبر آن،نمونه برداری کنیم)

()public void ClosePlugins :در اینجا عمل مخالف ADD را انجام میدهیم.
(public void Feedback(string Feedback, IPlugin Plugin : حالا Header ای را که در Interface تعریف کرده ایم.در کلاس Host مان آنرا پیاده سازی(define) میکنیم.چگونه پیاده سازی این تابع به پیاده سازی DLL مان مربوط نمیشود.

// ما درون namespace اصلیمان که Host نام دارد namespace دیگری را به نام Types تعریف میکنیم. درون این نام دامنه،دو کلاس به نام های AvailablePlugins و AvailablePlugin تعریف شده است. AvailablePlugins لیستی(collection) ای از AvailablePlugin است.در حقیقت ما بوسیله AvailablePlugin به پیدا کردن Plug-In ها میکنیم.هر موقع که آنها را پیدا کردیم،آنها را به لیست AvailablePlugins اضافه میکنیم و AvailablePlugin را NULL میکنیم.

2)Global.cs :این کلاس را بوجود آورده ایم که کارمان راحت تر شود،و نکته ی فنی قابل ذکری را در خود ندارد(پ.ن:برخلاف ادعای نویسنده این برنامه!)


پانوشت اول:تنها در صورتی عملکرد این برنامه برای شما کاملا روشن میشود که از شیوه ی Trace،استفاده کنید.
پانوشت دوم:در صورت علاقه مند بودن دوستان به ادامه بحث،پست های بعدیشان را به تکمیل برنامه بپردازند، و برای جلوگیری از زیاد شدن پست ها اگر پرسشی خارج از چهار چوب Plug-In داشتند.لطفا در تاپیکی جدا مطرح بفرمایند.
پانوشت سوم:به نظر من ایجاد service pack ، pack، add-ons ،Plug-In،Crack یکی از مباحث جالب صنعت نرم افزار و بازی سازی میباشد.
پانوشت چهارم:از دوستم،جناب asefy2008 تقاضا دارم این تاپیک را به بخش "دات نت" منتقل کنند.تا دوستان VB کار هم به جمع اضافه شوند.

govaleshgar2
یک شنبه 13 اردیبهشت 1388, 16:55 عصر
خلاصه جوابهای دوستان:
دو نوع Update داریم:
Update خودکار، از طریق اینترنت مثلاً با وب سرویس وجود نسخه جدید بررسی و اعمال میشود
Update دستی، کاربر برنامه بروز رسانی را در قالب یک فایل exe یا msi یا msp دریافت کرده وخودش نصب میکند.

سه روش Update داریم:
Update کامل، جایگزینی کامل برنامه با یک برنامه دیگر
جدا کردن محتویات یا همون Resource های برنامه از برنامه اصلی و بر روز کردن بخش محتویات
Update از طریق معماری قابل توسعه، یعنی برنامه بتواند با گرفتن dll های جدید یا همون Plug-in ها بر روز شود.

محمدامین شریفی
یک شنبه 13 اردیبهشت 1388, 17:07 عصر
سه روش Update داریم:


Update کامل، جایگزینی کامل برنامه با یک برنامه دیگر
Update از طریق معماری قابل توسعه، یعنی برنامه بتواند با گرفتن dll های جدید یا همون Plug-in ها بر روز شود.
جدا کردن محتویات یا همون Resource های برنامه از برنامه اصلی و بر روز کردن بخش محتویات


دو روش بالا،خلاصه تاپیک است.
درباره روش سوم شما،منظورتان update کردن DLL های برانامه که در resource قرار گرفته اند،میباشد؟
لطفا بیشتر توضیح دهید.

govaleshgar2
دوشنبه 14 اردیبهشت 1388, 16:42 عصر
منظور من update کردن resource های برنامه است، یعنی قرار دادن تعریف resource ها در فایلهای جداگانه به گونه ای که بتوان با رونویسی آنها ظاهر و اطلاعات برنامه را بروز کرد.
این روش بیشتر برای برنامه های داده-محور مناسب و درخور است، برنامه هایی مانند dictionary و برنامه های آموزش درس و ... بایستی از چنین روشی استفاده کنند.
این روش این مزیت را دارد که چون resource ها اغلب شامل داده های passive(غیر فعال) هستند امن تر هستند و اطمینان بیشتری دارد، در حالی که کاربر با گرفتن فایل dll و exe از طریق اینترنت و ... ممکن است ویروس بگیرد.


همچنین ابزار زیر نیز برای بروز رسانی برنامه ها از طریق اینترنت معرفی میکنم، سه ویژگی داره: این ابزار برای بروز رسانی از طریق اینتنرنت و شبکه است و از web service ها بهره میگرد و فارسی است. البته به نظر ناقص می آید و شاید به خوبی تست نشده باشد.
http://autoupdatemodule.codeplex.com/

محمدامین شریفی
دوشنبه 14 اردیبهشت 1388, 21:01 عصر
منظور من update کردن resource های برنامه است، یعنی قرار دادن تعریف resource ها در فایلهای جداگانه به گونه ای که بتوان با رونویسی آنها ظاهر و اطلاعات برنامه را بروز کرد.

این روش این مزیت را دارد که چون resource ها اغلب شامل داده های passive(غیر فعال) هستند امن تر هستند و اطمینان بیشتری دارد، در حالی که کاربر با گرفتن فایل dll و exe از طریق اینترنت و ... ممکن است ویروس بگیرد.

در یک کلام مثل ویندوز 9X ،درسته؟
البته این روش یک مشکل داره که اگر فایل های مهم نرم افزار را در resource ها تعریف کنیم،به راحتی توسط نرم افزارهای مخصوص هک میشوند،اینگونه نیست؟
مثل ویندوز و paint فارسی،درسته؟
اساتید لطفا در این باره نظر بدهند.

govaleshgar2
سه شنبه 15 اردیبهشت 1388, 14:26 عصر
خب، شاید! البته برای من طبقه بندی فایلهای مهم و غیر مهم معنا ندارد، من داده های Passive را از کدهای Active جدا میکنم و اونجا که در پستم هم گفته بودم که داده های passive اطمینان بیشتری دارند منظورم همین فرمایش شما بود.


سن من به ویندوز 9 ایکس و پینت و اینا نمیرسه!

asefy2008
سه شنبه 15 اردیبهشت 1388, 16:22 عصر
خب، شاید! البته برای من طبقه بندی فایلهای مهم و غیر مهم معنا ندارد، من داده های Passive را از کدهای Active جدا میکنم و اونجا که در پستم هم گفته بودم که داده های passive اطمینان بیشتری دارند منظورم همین فرمایش شما بود.


سن من به ویندوز 9 ایکس و پینت و اینا نمیرسه!
سلام دوست من گویا شما به این شکل برنامه نوشتین اگر لطف کنید یه نمونه بزارید خیلی خوب میشه.:لبخند:
ممنون

محمدامین شریفی
سه شنبه 15 اردیبهشت 1388, 16:50 عصر
خب، شاید! البته برای من طبقه بندی فایلهای مهم و غیر مهم معنا ندارد، من داده های Passive را از کدهای Active جدا میکنم و اونجا که در پستم هم گفته بودم که داده های passive اطمینان بیشتری دارند منظورم همین فرمایش شما بود.


سن من به ویندوز 9 ایکس و پینت و اینا نمیرسه!
گرچه میدونم منظورتون چی هست(مثل نرم افزارهای multilang) و شما هم میدونید منظور من چی هست(security)!ولی هر چی فکر میکنم نمیفهمم resource و web service،اصلا چه ربطی به پست اول و چهارم این تاپیک داره:متفکر:.
در ضمن به لینک پست قبلیت هم یک نظری بنداز.البته فراموش نشه که DLL هم در resource قرار میگیره و قبل از اینکه استفاده بشه هم "اعتبار سنجی" میشه.البته بجای DLL شما هم میتونید عکس upload کنید:لبخند:.
در ضمن یک سوال داشتم.شما تاحالا با ویندوز 98 کار نکرده اید؟


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

ولی جدا از بحث پست های اول و دوم.این روشی که استاد :قلب:govaleshgar2 فرمودند یک روش به روزرسانی است.و ما بهشون ابراز شاگردی میکنیم.
اگه لطف بفرمایند و چند راه استفاده از resource را جهت به روزرسانی نرم افزار بفرمایند،ممنون میشیم



پیروز باشید

govaleshgar2
شنبه 19 اردیبهشت 1388, 18:18 عصر
ویندوز 98 رو کمی شوخی کردم، ولی خب زیاد باهاش کار نکردم.

لینک مشکلی نداره، البته پروژه Release نداره ولی از طریق Source Code میتونید آخرین نسخه سورس کدهاش رو بگیرید.

در مورد برنامه نمونه به دلایل حقوقی امکان انتشار نداره! ببخشید.