با سلام
چطوری می شه تشخیص داد Framework روی یک سیستم نصب هست تا زمانی که برنامه اجرا می شه در صورت نصب نبودن Framework یک پیغام مناسب به کاربر داده بشه؟
Printable View
با سلام
چطوری می شه تشخیص داد Framework روی یک سیستم نصب هست تا زمانی که برنامه اجرا می شه در صورت نصب نبودن Framework یک پیغام مناسب به کاربر داده بشه؟
سلام
1- اگه با خود دات نت کد مینویسی ساده ترین راهش اینه که ببینی برنامه خودت بالا میاد یا نه :-) آخه اگه فریم ورک نصب نباشه, برنامه خودتم کار نمیکنه که حالا بخوای چک کنی نصب هست یا نه
2- ولی مثلا میتونه یه نیمچه کد با vb6 بنویسی و رجیستری رو چک کنی، چون وقتی نصب باشه، اونجا نوشته میشه (یه سرچ تو رجیستری بزن متوجه میشی)
نیلوفر ممنوننقل قول:
نوشته شده توسط niloufar
اما با چه کدی میتونیم بفهمیم برنامه مون داره اجرا میشه یا نه؟
بعدشم این که اگه کد بالا رو بنویسیم حتما یه جواب برمیگردونه : برنامه داره اجرا میشه. چون اگه اجرا نشه که این کد عمل نمیکنه!
فکر کنم با روش مشابه ابتکار شما بشه اون مشکل رو هم حل کرد: وقتی برنامه اجرا میشه تو یه جایی (مثلا همون Registery) یه تغییری بدیم بعد یه برنامه با وی بی بنویسیم و اون قسمت Registery رو چک کنه.
سلام
تنها راهش یه نیمچه برنامه نویسی با VB6 است
نه به نظرم راه بهتری هم باید باشه. VB6 مرده. پس متوسل شدن به یک مرده منطقی نیست اون هم در مورد یک مجموعه مثل VS2005
سلامنقل قول:
نوشته شده توسط SYSMAN
همین مجموعه بزرگ (2005) که خودم هم دیدید در پست هام خیلی طرفداریشو میکنم، یه ضعف خیلی بزرگ داره و اون اینکه بدون DotNet Framework کار نمیکنه
البته اگه یکی بتونه یه راهی پیدا کنه که بتونه این Framework رو هم در داخل برنامه ریسورس کنه (که بعید نیست ولی راه خوبی نیست که چند ده مگابایت به ریسورس اضافه کنیم) خوب احتمالا دیگه نیازی بهش نیست
ولی اصلا دنبال این نباشید که بدون وجود Framework (نه نصبی نه ریسورسی) برنامه هاتون کار کنه و بدون این Framework فقط دنبال برنامه های کوتاه VB6ای باشید.
سلامنقل قول:
نوشته شده توسط niloufar
این اصلا ضعف نیست. یک طرفه به موضوع نگاه نکنید.
در پناه حق موفق باشید و پرتوان
با عرض ادب خدمت اساتید VB.NET !!!
به استحضار می رساند که با استفاده از خاصیت Version کلاس Environment به راحتی قادر به، به دست آوردن نسخه ی NET Framework. بر روی سیستم خود هستید.
این متد، کلاسی از نوع Version را برگشت می دهد که دارای تعدادی متد و خاصیت جهت آگاهی از نسخه ی دات نت فریمورک نصب شده بر روی سیستم است.
مثال:
Dim objVersion As Version
objVersion = System.Environment.Version
MessageBox.Show(objVersion.ToString)
می تونید مشخصه های Major، Minor، Build را نیز با استفاده از خواص این کلاس به دست آورید.
موفق باشید.
جناب آقای راد،
مشکل اینجاست که اصلاً برنامه روی سیستم عاملی که dotnetframework نداره اجرا نمیشه که بخواهیم با این روش ورژن آن را چک کنیم.
روش شما برای زمانی مناسبه که بدونیم dotnetframework هست اما نمیدونیم کدوم ورژن اون.
جناب آقای SYSMAN،
جواب شما اینجا هست:
http://www.codeproject.com/dotnet/DetectDotNet.asp
it's an unmanaged C++ class with zero dependency on anything .NET related
سلام
1- آقای محمدی، شما دو طرفه نگاه کنید و به ما هم بگویید چرا این یک ضعف نیست. چرا به این دلفی بنده خدا که بدون هیچگونه ستاپ کردنی برنامش کار میکنه، نمیگیم قدرت؟
2- آقای راد، بنده که شما را به عنوان یکی از بهترینهای برنامه نویسی قبول دارم. دیگه لازم نبود که چهارتا بچه مثل ما را مسخره کنید و با گذاشتن کلی علامت تعجب جلوی "با عرض ادب خدمت اساتید VB.NET" اینو ثابت کنید :-) ولی الحق که حق دارید.
3- اما آقای راد، اصلا وقتی برنامه اجرا نمیشه، به چه درد میخوره که ما بدونیم ورژن فریم ورک چنده؟
آقای صابر:
من اون zip رو دانلود کردم ولی ظاهرا به زبان C++ بود که من هم نصب ندارم که امتحانش کنم. ولی اگر خودتون تستش کردید، میشه بفرمایید بالاخره چطور بدون نصب فریم ورک، این برنامه کار میکنه. در واقع این نیاز به هیچ یک از کلاسهای فریم ورک نداره؟
خانم نیلوفر،نقل قول:
نوشته شده توسط niloufar
این فایلها هیچ وابستگی به dotnetframework ندارن.
من تا حالا با unmanaged code توی visual studio کار نکردم.
فقط با جستجو دیدم که انگار میشه این کدها رو با visual studio 2003 و 2005 کامپایل کرد.
کسی که میدونه چطور؟
یادآوری
فایل رو از اینجا داونلود کنید: http://www.codeproject.com/dotnet/DetectDotNet.asp
سلام به همگی
دوست عزیز Behrouz_Rad . این کدی که شما فرمودید رو باید کجا نوشت . ؟
خودتان هم عرض کردید که بدون دات نت فریم ورک هیچ برنامه با این نسخه اجرا نخواهد شد .
در ضمن خدمت دوستانی هم که راه حل VB6 را پیشنهاد کردند یه سوال دارم . مگر برنامه های VB6 هم بدون پکیج و اون چند فایل اصلی اجرا میشن . اونها هم که خودشون نیازمند یه تعداد فایل Base هستند . ؟ اگر جواب بدین ممنون میشم .
سلامنقل قول:
نوشته شده توسط habedijoo
1- حقیقتش منم هنوز نوفهمیدم که این کدها چه جوری بدون DotNetFramework کار میکنن، جناب آقای راد اگه لطف کنید توضیح بدید ممنون میشم اگه توضیح بدید (راستی آقای راد جدی من اون قبلی رو فقط به صرف مزاح گفتم. تازه از :-) اینا هم که جلوش گذاشته بودم. ولی راستی راستی بنده شما را به عنوان یکی از بهترینا قبول دارم)
2- جناب عابدی جو، برنامه های VB6 فقط به دوتا dll برای کار نیاز دارن که میتونید اونا را (بجای شاخه سیستم) از کنار خود برنامه بخونید.
3- جدی جدی چه طور میشه برنامه تحت دات نت بدون فریم ورک کار کنه؟
کد های unmanaged نوشته شده در VC++.Net چه 2003 و چه 2005 هردو درصورتیکه در مد Unmanaged کامپایل شند میتونن بدون نیاز به وجود Framework روی سیستم کلاینت اجرا بشند (دلیلش هم واضحه ، استفاده از کد unmanaged یعنی عدم بهره گیری از قابلیت های CLR runtime )
بنابراین تکه برنامه ای که راجع بهش صحبت شد با استفاده از این قابلیت اجرا میشه.
متشکرم آقای فرهاد،
بله، میدونیم که اجرا میشه، اما نمیدونیم چطور؟!
آیا باید آنها را به صورت dll در آورد و به عنوان refrence به پروژه اجرا کرد؟
چطور آنها را dll کنیم؟
خیر ،در هر صورت اگر هم بشه به عنوان یک Unmanaged assembly اون رو به پروژه اضافه کرد چیزی که اول اجرا میشه برنامه Managed شماست که درصورت نبود فریم ورک اجرا نخواهد شد.
درصورتی میتونید از کلاسی که در مقاله فوق قرار داره استفاده کنید که برنامه اصلی هم Unmanaged باشه، (همان نمونه ای که در خود مقاله ذکر شده ، مثلا استفاده از این کد در برنامه های Installer جهت تشخیص وجود فریم ورک و ...)
بنابراین درصورتیکه برنامه اصلی "مدیریت شده" است ؛ راهی که عموما استفاده میشود اجرای تکه برنامه detector در ابتدا و سپس اجرای برنامه اصلی از طریق همان detector در صورت وجود فریم ورک میباشد.
سلام
1- این نوع کامپایل که فرمودید (Unmanaged) فقط تو C++ کار میکنه؟
2- دقیقا چه نوع کارهایی را میشه تو این روش کامپایل برنامه نویسی کرد؟
3- آقای راد، چرا پستتونو پاک کرده اید، آیا مشکلی داشت؟
حق با شماست، اگر به عنوان refrence (و یا به قول شما unmanaged assembly) به پروژه اضافه بشه، اول پروژهی managed اجرا میشه که به داتنت نیاز داره اجرا میشه.نقل قول:
نوشته شده توسط Farhad.B.S
پس باید اینکار رو کرد:
یک برنامه کوچک unmanaged بنویسیم که با استفاده از کلاسی که توی اون مقاله قابل دانلود هست، تشخیص بده که مثلاً آیا داتنت ورژن ۲ نصب هست و یا خیر.
اگر نصب بود، پروژه اجرا بشه و اگر نصب نبود، dotnetframework نصب بشه.
درسته؟
حالا یک سوال پیش میاد، با استفاده از VS 2005 چطور میتونیم یک پروژه unmanaged رو کامپایل و اجرا کنیم؟
حق با شماست، اگر به عنوان refrence (و یا به قول شما unmanaged assembly) به پروژه اضافه بشه، اول پروژهی managed اجرا میشه که به داتنت نیاز داره اجرا میشه.نقل قول:
نوشته شده توسط Farhad.B.S
پس باید اینکار رو کرد:
یک برنامه کوچک unmanaged بنویسیم که با استفاده از کلاسی که توی اون مقاله قابل دانلود هست، تشخیص بده که مثلاً آیا داتنت ورژن ۲ نصب هست و یا خیر.
اگر نصب بود، پروژه اجرا بشه و اگر نصب نبود، dotnetframework نصب بشه.
درسته؟
حالا یک سوال پیش میاد، با استفاده از VS 2005 چطور میتونیم یک پروژه unmanaged رو کامپایل و اجرا کنیم؟
1.بلهنقل قول:
1- این نوع کامپایل که فرمودید (Unmanaged) فقط تو C++ کار میکنه؟
2- دقیقا چه نوع کارهایی را میشه تو این روش کامپایل برنامه نویسی کرد؟
2.استفاده از کتابخانه های MFC و ATL و Win32
1.بله همینطوره.نقل قول:
اگر نصب بود، پروژه اجرا بشه و اگر نصب نبود، dotnetframework نصب بشه.
درسته؟
حالا یک سوال پیش میاد، با استفاده از VS 2005 چطور میتونیم یک پروژه unmanaged رو کامپایل و اجرا کنیم؟
2.همونطور که در بالا عرض کردم این امکان فقط در کامپایلر VC++.Net وجود داره.
همینطور ابزارهایی وجود دارند که کد های IL تولید شده توسط کامپایلر های VB.Net ، CShrap و ... رو میتونن به کد native سیستم عامل تبدیل کنند، بنابراین میتونید با استفاده از این ابزارها یک فایل اجرایی مستقل (با همون شرایطی که در پست اول بهش اشاره کردم) ایجاد کنید.
در برداشت منظور دوستمون اشتباه کردم.نقل قول:
آقای راد، چرا پستتونو پاک کرده اید، آیا مشکلی داشت؟
پاسخ فرهاد جان درسته.
موفق باشید.نقل قول:
راهی که عموما استفاده میشود اجرای تکه برنامه detector در ابتدا و سپس اجرای برنامه اصلی از طریق همان detector در صورت وجود فریم ورک میباشد.
سلام به همه دوستان
دوستان همه فرمایشات درست . میشه یک نفر یه مثال شسته رفته بزار تا قضیه سر وتهش به هم بیاد .
ممنونم از همه
یعنی یک برنامه باشه که اول وجود دات نت رو چک کنه و در صورت نبود اونو نصب کنه و بعد برنامه شما رو اجرا کنه تمام این دعواها و بحثها تموم میشه ؟؟؟؟؟
اگر اینطوره یک هفته به من وقت بدید براتون بنویسم و اگر هم غیر از اینه که هیچ .
بله همینه :)نقل قول:
نوشته شده توسط بابک زواری
اما بحث اینجاست که با چه زبانی باید نوشته بشه؟
اگر با unmanaged cpp، چطور باید توی vs 2005 کامپایل بشه؟
تو سایت میکروسافت نوشته :
Determine which versions of the .NET Framework are installed on a computer
The easiest way to determine which versions of the .NET Framework are installed on a computer is to locate the %systemroot%\Microsoft.NET\Framework folder. You can paste the listed address for the Framework folder into a Windows Explorer address bar to navigate to the Framework folder. The three released versions of the .NET Framework are contained in the following folders:
•v1.0.3705
•v1.1.4322
•v2.0.50727
من برای خودم اینطور کار کردم که برنامه ایی رو با C یا Delphi مینویسم که SPlash برنامه اصلی است اگر فریم ورک نبود که اتوماتیک اونو نصب میکنه ولی اگر بود برنامه ایی رو که با دات نت نوشتم رو اجرا میکنه .
Determine which versions of the .NET Framework are installed on a computer
The easiest way to determine which versions of the .NET Framework are installed on a computer is to locate the %systemroot%\Microsoft.NET\Framework folder. You can paste the listed address for the Framework folder into a Windows Explorer address bar to navigate to the Framework folder. The three released versions of the .NET Framework are contained in the following folders: •v1.0.3705•v1.1.4322•v2.0.50727
سلام بابک جان
آقا ما منتظر مثالت هستیم . دستت درد نکنه .
به هر حال این مساله که با vb.net نمیشه فهمید که Frame work روی کامپیوتر نصبه یا نه خودش یک ضعف خیلی بده
سلام به همگی دوستان
چرا این بحث به این مهمی نیمه کاره رها شد . من نمیدونم .
به هر حال این لینک رو ببینید . http://www.kbalertz.com/Feedback_914135.aspx
خوب راه حلی پیدا نشد جز راه حل استاد زواری؟
اینم یک راه حل نه زیاد جالب
ساده ترین روش برای دونستن اینکه .NET در یک کامپیوتر نصب هست یا نه اینه که وجود فایل MSCorEE.dll رو در دایرکتوری %WinDir%\System32 بررسی کنیم. در صورت وجود این فایل میشه فهمید که در اوون سیستم .NET Framework وجود داره.
اما اگر به دلایلی بخواهیم از نصب بودن نسخه ی خاصی از .NET مطمین بشیم می تونیم کلید زیر رو در رجیستری بررسی کنیم:
HKEY_LOCAL_MACHINE\SOFTWARE\microsoft\.NETFramewor k\Policy
قبلا یک سری مطلب در بخش مقالات سایت در مورد ارتباط فایل MSCorEE.dll با اجرای برنامه های تحت .NET نوشته بودم که متاسفانه همه پاک شدن.
به نظر این راه بهتری هست باز هم باید تست بشه ببینم چه طوری جواب می دهد.
یه راه دیگه هم هست اونم اینکه وقتی داریم برنامه رو با Install Shield . pakage میکنیم فریم ورک رو هم توش بزاریم و هنگام نصب فریم ورک رو هم نصب کنه
خب اگه قبلاً Framework نصب بوده باشه چی؟نقل قول:
یه راه دیگه هم هست اونم اینکه وقتی داریم برنامه رو با Install Shield . pakage میکنیم فریم ورک رو هم توش بزاریم و هنگام نصب فریم ورک رو هم نصب کنه
ضمناً انقدر به Framework حمله نکنین. این حرف شما که نمیشه دید Framework نصب شده یا نه درسته. اما Framework باعث میشه که توی برنامه های بزرگ حجم برنامه گاهی تا صدها مگابایت پایین بیاد. چون شما دیگه لازم نیست که همه کامپوننتها یا کتابخانه هایی رو که استفاده کردین توی resource برنامه قرار بدین.
ببینید اگه همزمان با نصب برنامه فریمورک رو نصب کنیم دیگه مطمئن هستیم نصبه و نیازی به نصب نداره و اگر توی پکیج باشه با ریمو کردن هم ریمو میشه ولی برای مواقعی که فریم ورک رو یه نرم افزار دیگه نصب کرده باشه فکر کنم همون چک کردن رجیستری توی اسپلش بهترین راه باشه
اصلاٌ راهی هست که بشه یهنرم افزار دیگه حالا فریم ورک نبود آفیس مثلاٌ رو همزمان با برنامه نصب کرد چون من این سوال رونوشته بودم ولی هیچ کس جوابی نداد
اگر قبلا framework نصب شده باشه instal shield از کنارش می گذره یعنی اگه نصب باشه که هیچ و اگه نصب نباشه نصبش می کنه
بله منم همینو میگم فقط یه مشکل هست که چطورمیشه برنامه روبا InstallShield توری پکیج کرد که همزمان با نصب برنامه فریمورک و هم نصب کنه
اگر این حل بشه خیلی خوبه
سلام .
با VB6 یا ++C یا هر زبان دیگه ای که پایه اش net framework نیست بگذارید از از آدرس زیر در رجیستری :HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\.NETFramewo rk
مقدار InstallRoot را بگیره ، اگر وجود داشت که یعنی نصبه(البته بازم می تونه نباشه) و اگر هم نبود که نصب نیست .
موفق باشید .
سلام
ما تو همون صفحه اول به دوستمون گفتیم که باید در VB6 تست کنید
همه اعتراض کردند که چرا حرف از وی بی 6 میزنی
دوستان گفتند که دیگه شان ما اجل از وی بی 6 است
خلاصه الان چهار صفحه تاپیک طولانی شده
تازه حالا همه میفرمایند باید با یه چیزی که پایش رو Framework نیست اونو چک کرد (حالا کلاس رو بالا بردند و میگن مثلا با C++ !!!!!!)
خوب دیگه ....
نیلوفر خانم ، VB6 نمرده ،مشکل اینجاست دوستان برای اینکه مثلا کلاس برنامه هاشون پایین نیاد میگن VB مرده ، ولی همیشه راحتترین راه رو رانتخاب کردن بهتر از انتخاب سختترین راه است .
موفق باشید
سلامنقل قول:
نوشته شده توسط meandyouwith2003
دقیقا...
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
// In case the machine this is compiled on does not have the most recent platform SDK
// with these values defined, define them here
#ifndef SM_TABLETPC
#define SM_TABLETPC 86
#endif
#ifndef SM_MEDIACENTER
#define SM_MEDIACENTER 87
#endif
// Constants that represent registry key names and value names
// to use for detection
const TCHAR *g_szNetfx10RegKeyName = _T("Software\\Microsoft\\.NETFramework\\Policy\\v1 .0");
const TCHAR *g_szNetfx10RegKeyValue = _T("3705");
const TCHAR *g_szNetfx10SPxMSIRegKeyName = _T("Software\\Microsoft\\Active Setup\\Installed Components\\{78705f0d-e8db-4b2d-8193-982bdda15ecd}");
const TCHAR *g_szNetfx10SPxOCMRegKeyName = _T("Software\\Microsoft\\Active Setup\\Installed Components\\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}");
const TCHAR *g_szNetfx10SPxRegValueName = _T("Version");
const TCHAR *g_szNetfx11RegKeyName = _T("Software\\Microsoft\\NET Framework Setup\\NDP\\v1.1.4322");
const TCHAR *g_szNetfx20RegKeyName = _T("Software\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727");
const TCHAR *g_szNetfx11PlusRegValueName = _T("Install");
const TCHAR *g_szNetfx11PlusSPxRegValueName = _T("SP");
// Function prototypes
int GetNetfx10SPLevel();
int GetNetfx11SPLevel();
int GetNetfx20SPLevel();
bool IsCurrentOSTabletMedCenter();
bool IsNetfx10Installed();
bool IsNetfx11Installed();
bool IsNetfx20Installed();
bool RegistryGetValue(HKEY, const TCHAR*, const TCHAR*, DWORD, LPBYTE, DWORD);
/************************************************** ****************
Function Name: IsNetfx10Installed
Description: Uses the detection method recommended at
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetdep/html/dotnetfxref.asp
to determine whether the .NET Framework 1.0 is
installed on the machine
Inputs: NONE
Results: true if the .NET Framework 1.0 is installed
false otherwise
************************************************** ****************/
bool IsNetfx10Installed()
{
TCHAR szRegValue[MAX_PATH];
return (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx10RegKeyName, g_szNetfx10RegKeyValue, NULL, (LPBYTE)szRegValue, MAX_PATH));
}
/************************************************** ****************
Function Name: IsNetfx11Installed
Description: Uses the detection method recommended at
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetdep/html/redistdeploy1_1.asp
to determine whether the .NET Framework 1.1 is
installed on the machine
Inputs: NONE
Results: true if the .NET Framework 1.1 is installed
false otherwise
************************************************** ****************/
bool IsNetfx11Installed()
{
bool bRetValue = false;
DWORD dwRegValue=0;
if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx11RegKeyName, g_szNetfx11PlusRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
{
if (1 == dwRegValue)
bRetValue = true;
}
return bRetValue;
}
/************************************************** ****************
Function Name: IsNetfx20Installed
Description: Uses the detection method recommended at
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetdep/html/redistdeploy1_1.asp
to determine whether the .NET Framework 2.0 is
installed on the machine
Inputs: NONE
Results: true if the .NET Framework 2.0 is installed
false otherwise
************************************************** ****************/
bool IsNetfx20Installed()
{
bool bRetValue = false;
DWORD dwRegValue=0;
if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx20RegKeyName, g_szNetfx11PlusRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
{
if (1 == dwRegValue)
bRetValue = true;
}
return bRetValue;
}
/************************************************** ****************
Function Name: GetNetfx10SPLevel
Description: Uses the detection method recommended at
http://blogs.msdn.com/astebner/archive/2004/09/14/229802.aspx
to determine what service pack for the
.NET Framework 1.0 is installed on the machine
Inputs: NONE
Results: integer representing SP level for .NET Framework 1.0
************************************************** ****************/
int GetNetfx10SPLevel()
{
TCHAR szRegValue[MAX_PATH];
TCHAR *pszSPLevel = NULL;
int iRetValue = -1;
bool bRegistryRetVal = false;
// TODO - Need to detect what OS we are running on so we know what
// registry key to use to look up the SP level
if (IsCurrentOSTabletMedCenter())
bRegistryRetVal = RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx10SPxOCMRegKeyName, g_szNetfx10SPxRegValueName, NULL, (LPBYTE)szRegValue, MAX_PATH);
else
bRegistryRetVal = RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx10SPxMSIRegKeyName, g_szNetfx10SPxRegValueName, NULL, (LPBYTE)szRegValue, MAX_PATH);
if (bRegistryRetVal)
{
// This registry value should be of the format
// #,#,#####,# where the last # is the SP level
// Try to parse off the last # here
pszSPLevel = _tcsrchr(szRegValue, _T(','));
if (NULL != pszSPLevel)
{
// Increment the pointer to skip the comma
pszSPLevel++;
// Convert the remaining value to an integer
iRetValue = _tstoi(pszSPLevel);
}
}
return iRetValue;
}
/************************************************** ****************
Function Name: GetNetfx11SPLevel
Description: Uses the detection method recommended at
http://blogs.msdn.com/astebner/archive/2004/09/14/229574.aspx
to determine what service pack for the
.NET Framework 1.1 is installed on the machine
Inputs: NONE
Results: integer representing SP level for .NET Framework 1.1
************************************************** ****************/
int GetNetfx11SPLevel()
{
DWORD dwRegValue=0;
if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx11RegKeyName, g_szNetfx11PlusSPxRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
{
return (int)dwRegValue;
}
// We can only get here if the .NET Framework 1.1 is not
// installed or there was some kind of error retrieving
// the data from the registry
return -1;
}
/************************************************** ****************
Function Name: GetNetfx20SPLevel
Description: Uses the detection method recommended at
http://blogs.msdn.com/astebner/archive/2004/09/14/229574.aspx
to determine what service pack for the
.NET Framework 2.0 is installed on the machine
Inputs: NONE
Results: integer representing SP level for .NET Framework 2.0
************************************************** ****************/
int GetNetfx20SPLevel()
{
DWORD dwRegValue=0;
if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx20RegKeyName, g_szNetfx11PlusSPxRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
{
return (int)dwRegValue;
}
// We can only get here if the .NET Framework 2.0 is not
// installed or there was some kind of error retrieving
// the data from the registry
return -1;
}
bool IsCurrentOSTabletMedCenter()
{
// Use GetSystemMetrics to detect if we are on a Tablet PC or Media Center OS
return ( (GetSystemMetrics(SM_TABLETPC) != 0) || (GetSystemMetrics(SM_MEDIACENTER) != 0) );
}
/************************************************** ****************
Function Name: RegistryGetValue
Description: Get the value of a reg key
Inputs: HKEY hk - The hk of the key to retrieve
TCHAR *pszKey - Name of the key to retrieve
TCHAR *pszValue - The value that will be retrieved
DWORD dwType - The type of the value that will be retrieved
LPBYTE data - A buffer to save the retrieved data
DWORD dwSize - The size of the data retrieved
Results: true if successful, false otherwise
************************************************** ****************/
bool RegistryGetValue(HKEY hk, const TCHAR * pszKey, const TCHAR * pszValue, DWORD dwType, LPBYTE data, DWORD dwSize)
{
HKEY hkOpened;
// Try to open the key
if (RegOpenKeyEx(hk, pszKey, 0, KEY_READ, &hkOpened) != ERROR_SUCCESS)
{
return false;
}
// If the key was opened, try to retrieve the value
if (RegQueryValueEx(hkOpened, pszValue, 0, &dwType, (LPBYTE)data, &dwSize) != ERROR_SUCCESS)
{
RegCloseKey(hkOpened);
return false;
}
// Clean up
RegCloseKey(hkOpened);
return true;
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
int iNetfx10SPLevel = -1;
int iNetfx11SPLevel = -1;
int iNetfx20SPLevel = -1;
TCHAR szMessage[MAX_PATH];
// Determine whether or not the .NET Framework
// 1.0, 1.1 or 2.0 are installed
bool bNetfx10Installed = IsNetfx10Installed();
bool bNetfx11Installed = IsNetfx11Installed();
bool bNetfx20Installed = IsNetfx20Installed();
// If .NET Framework 1.0 is installed, get the
// service pack level
if (bNetfx10Installed)
{
iNetfx10SPLevel = GetNetfx10SPLevel();
if (iNetfx10SPLevel > 0)
_stprintf(szMessage, _T(".NET Framework 1.0 service pack %i is installed."), iNetfx10SPLevel);
else
_stprintf(szMessage, _T(".NET Framework 1.0 is installed with no service packs."));
MessageBox(NULL, szMessage, _T(".NET Framework 1.0"), MB_OK | MB_ICONINFORMATION);
}
else
{
MessageBox(NULL, _T(".NET Framework 1.0 is not installed."), _T(".NET Framework 1.0"), MB_OK | MB_ICONINFORMATION);
}
// If .NET Framework 1.1 is installed, get the
// service pack level
if (bNetfx11Installed)
{
iNetfx11SPLevel = GetNetfx11SPLevel();
if (iNetfx11SPLevel > 0)
_stprintf(szMessage, _T(".NET Framework 1.1 service pack %i is installed."), iNetfx11SPLevel);
else
_stprintf(szMessage, _T(".NET Framework 1.1 is installed with no service packs."));
MessageBox(NULL, szMessage, _T(".NET Framework 1.1"), MB_OK | MB_ICONINFORMATION);
}
else
{
MessageBox(NULL, _T(".NET Framework 1.1 is not installed."), _T(".NET Framework 1.1"), MB_OK | MB_ICONINFORMATION);
}
// If .NET Framework 2.0 is installed, get the
// service pack level
if (bNetfx20Installed)
{
iNetfx20SPLevel = GetNetfx20SPLevel();
if (iNetfx20SPLevel > 0)
_stprintf(szMessage, _T(".NET Framework 2.0 service pack %i is installed."), iNetfx11SPLevel);
else
_stprintf(szMessage, _T(".NET Framework 2.0 is installed with no service packs."));
MessageBox(NULL, szMessage, _T(".NET Framework 2.0"), MB_OK | MB_ICONINFORMATION);
}
else
{
MessageBox(NULL, _T(".NET Framework 2.0 is not installed."), _T(".NET Framework 2.0"), MB_OK | MB_ICONINFORMATION);
}
return 0;
}
این کد کاملا صحیحه و کار میکنه .
حالا باید چیکار کنیم ؟
به نظر شما با خود برنامه های دات نت میشه تشخیص داد که دات نت نصب یا نه ؟
البته تو یک تاپیک دیدم که نوشته بودن اگر فایلهای DLL مورد نیاز برنامه رو کنارش کپی کنید و اصلا فریم ورک نصب نشه برنامه کار میکنه ( من درستی این مطلب رو تائید یا رد نمیکنم ) اما به نظر شما میشه که با کمک این کار حتی اگر برنامه کار هم نکنه یک خطا ایجاد کنه که با کمک اون بشه یک فایل اجرائی را اجرا کرد که دات نت نصب بشه.
Namespace My
' The following events are availble for MyApplication:
'
' Startup: Raised when the application starts, before the startup form is created.
' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally.
' UnhandledException: Raised if the application encounters an unhandled exception.
' StartupNextInstance: Raised when launching a single-instance application and the application is already active.
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
Partial Friend Class MyApplication
Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.Unhandle dExceptionEventArgs) Handles Me.UnhandledException
End Sub
Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupE ventArgs) Handles Me.Startup
End Sub
End Class
End Namespace
Namespace My
'NOTE: This file is auto-generated; do not modify it directly. To make changes,
' or if you encounter build errors in this file, go to the Project Designer
' (go to Project Properties or double-click the My Project node in
' Solution Explorer), and make changes on the Application tab.
'
Partial Friend Class MyApplication
<Global.System.Diagnostics.DebuggerStepThroughAttr ibute()> _
Public Sub New()
MyBase.New(Global.Microsoft.VisualBasic.Applicatio nServices.AuthenticationMode.Windows)
Me.IsSingleInstance = false
Me.EnableVisualStyles = true
Me.SaveMySettingsOnExit = true
Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.S hutdownMode.AfterMainFormCloses
End Sub
<Global.System.Diagnostics.DebuggerStepThroughAttr ibute()> _
Protected Overrides Sub OnCreateMainForm()
Me.MainForm = Global.WindowsApplication1.Form1
End Sub
End Class
End Namespace
اگر کسی سیستمی داره که دات نت دو نداره من این دو قسمت بالا رو هندل کنم و فایلش رو بفرستم تا روی اون سیستم تست کنه و جوابش بذاره همین جا
استاد سلام . من می تونم تستش کنم .
hamed_bostan@yahoo.com
دقیقا باید چیکار کنم؟
سلام منم میتونم تست کنم فقط باید تمام مراحل رو کامل بگید من آشنایی زیادی ندارم
معضرت میخوام.
شما خودتونو درگیر مسائل پیچیده ای میکنید که به راحتی قابل حل است.
به راحتی میشه یه فایل .js نوشت که رجیستری رو چک کنه. اگه کلید گفته شده در رجیستری وجود نداشت فایل نصب dotnetframework رو از پوشه جاری اجرا کنه.
اسم این فایل میتونه RunMeFirst.js باشه که کاربر را موضف میکنید اول این فایل رو اجرا کنه.
همونطور که میدونید اینها فایل های اوپن سورس Windows Script Host هستند که بدون کامپایل و هیچ نوع دنگ و فنگ دیگه اجرا میشن.
پیشنهاد میکنم با WSH و فایل های .reg و .inf حتما آشنا بشید. چون خیلی کارها رو خیلی راحت با این نوع فایل ها میتونید انجام بدید.
برنامه های Installer نیز این کار را خود به طور خودکار می کنند.