PDA

View Full Version : مبتدی: اضافه کردن رفرنس در موقع اجرا برنامه از داخل برنامه



Collector
چهارشنبه 21 تیر 1391, 18:44 عصر
سلام

برنامه ای میخاوم بنویسم که
اگر یک DLL خواص کنار برنامه نبود آن را از یک آدرس دانلود کند.

مشکلی با دانلود DLL ندارم .
مشکل اینجاست که چطوری هنگام اجرای برنامه آن را به رفرنس اضافه کنم.

Collector
پنج شنبه 22 تیر 1391, 14:38 عصر
این برنامه (http://www.codeproject.com/Articles/11658/Programmatically-add-references-to-Visual-Studio-N) فقط میتونه رفرنس هایی خود ویژوال استودیو را ادد کند ولی من میخوام آدرس را خودم بدم به برنامه و آن را ادد کند.

gwbasic
شنبه 24 تیر 1391, 12:01 عصر
نتیجه Add Reference در محیط ویژوال استدیو به صورت ساده اینه که dll مورد نظر کنار فایل exe برنامه قرار می گیره بنابراین شما اگر می خواین از dll در زمان اجرا استفاده کنید کافیه اونو کنار فایل exe برنامه قرار بدین و با استفاده از reflection از در زمان اجرا اون استفاده کنید. البته ناگفته نماند که این dll میتونه در هر مسیری باشه ولی شما در این حالت باید مسیر dll را هم هنگام reflection در نظر بگیرید

Collector
شنبه 24 تیر 1391, 14:06 عصر
نتیجه Add Reference در محیط ویژوال استدیو به صورت ساده اینه که dll مورد نظر کنار فایل exe برنامه قرار می گیره بنابراین شما اگر می خواین از dll در زمان اجرا استفاده کنید کافیه اونو کنار فایل exe برنامه قرار بدین و با استفاده از reflection از در زمان اجرا اون استفاده کنید. البته ناگفته نماند که این dll میتونه در هر مسیری باشه ولی شما در این حالت باید مسیر dll را هم هنگام reflection در نظر بگیرید

من از این کد قبل از اینکه فرم اصلی لود بشه استفاده کردم. ما چون از کلاس های اون دی ال ال در برنامه استفاده کردم ارور داد.


System.Reflection.Assembly.LoadFrom("DotRas.dll");

سورس برنامه

fjm11100
شنبه 24 تیر 1391, 19:51 عصر
Reflection با Add Ref فرق داره. شما اگه Add Ref نکنی ممکنه اصلا برنامه ات کامپایل نشه. ولی اگر لود کردن داینامیک است چاره Reflection است.

Collector
شنبه 24 تیر 1391, 20:20 عصر
Reflection با Add Ref فرق داره. شما اگه Add Ref نکنی ممکنه اصلا برنامه ات کامپایل نشه. ولی اگر لود کردن داینامیک است چاره Reflection است.

امکانش هست که قبل از اجرای برنامه, Dll را در کد نویسی وارد Add Ref کنم.

fjm11100
شنبه 24 تیر 1391, 20:30 عصر
امکان پذیر نیست حتما باید add کنید.

Reza_Yarahmadi
شنبه 24 تیر 1391, 21:10 عصر
چیزی که من از حرفهای شما متوجه شدم اینه که شما زمان کد نویسی میدونید چه رفرنس هایی برنامه شما نیاز داره! Reflection بصورت کلی برای مواقعی استفاده میشه که شما بخواید از رفرنس های متنوع (که زمان کد نویسی خیلی معلوم نیست) استفاده میشه.
برای اون چیزی که شما میخواید میتونید در ابتدای اجرای برنامه و قبل از باز شدن فرم اصلی چک کنید ببینید تمام رفرنسهای برنامه روی سیستم کاربر موجود هست یا نه (با یه try / catch ساده) در صورتی که نبود برنامه لود نشه و درخواست دانلود فایل های مورد نظر رو بده.

Collector
شنبه 24 تیر 1391, 21:45 عصر
چیزی که من از حرفهای شما متوجه شدم اینه که شما زمان کد نویسی میدونید چه رفرنس هایی برنامه شما نیاز داره! Reflection بصورت کلی برای مواقعی استفاده میشه که شما بخواید از رفرنس های متنوع (که زمان کد نویسی خیلی معلوم نیست) استفاده میشه.
برای اون چیزی که شما میخواید میتونید در ابتدای اجرای برنامه و قبل از باز شدن فرم اصلی چک کنید ببینید تمام رفرنسهای برنامه روی سیستم کاربر موجود هست یا نه (با یه try / catch ساده) در صورتی که نبود برنامه لود نشه و درخواست دانلود فایل های مورد نظر رو بده.

مشکل من هم دقیقا همین جاست اگر لینکی که در پست 2 گذاشته ام را بررسی کنید. این برنامه میتونه رفرنس را هنگام اجرا برنامه اضافه کنه ولی فقط رفرنس های فرمورک دات نت را نه فایلی که خودم دارم.

در پست 4 هم من یک برنامه گذاشتم که نیاز به اضافه کردن یک دی ال ال دارد تا کامپایل شود. پس من نمیتونم برنامه را اجرا کنم و کدی بنویسم که چک کند که اگر آن رفرنس نبود آن را اضافه کند.


الان مشکل اصلی اضافه کردن رفرنس در زمان اجرا هست .

اگر بشه قبل از اجرای برنامه چک کرد خیلی خوب میشه منظورم اینه که قبل از این که فایل وارد حافضه بشه و برنامه رفرنس ها را چک کند.
من چطوری میتونم برای اون قسمت برنامه بنویسم؟

fjm11100
شنبه 24 تیر 1391, 22:45 عصر
ببین اول روشن کن منظورت runtime است یا designtime؟
اگر برنامه ات کامپایل میشه پس مشکلت runtime است. می خوای اگر dll نبود قبل باز شدن فرم پیام بده؟ خب می تونی توی فرم قبلی یا Program.cs کد چک کردن وجود یا عدم وجود فایل را بکار ببری:
System.Io.File.Exists

Reza_Yarahmadi
شنبه 24 تیر 1391, 23:22 عصر
راستش رو بخوای اصلا نفهمیدم چی میخواید. اگر برنامه قبلا کد نویسی و کامپایل شده و شما در زمان اجرای برنامه میخواید ببینید تمام رفرنسها وجود دارند میتونید توی Program.cs در اولین خط Main با استفاده از try / catch از هر رفرنس یک کلاس رو ایجاد کنید اگر مشکلی نبود که هیچ در غیر اینصورت پنجره انتخاب فایل باز بشه و درخواست فایل dll رو کنه اونو کنار فایل اجرایی برنامه کپی کنه
static void Main()
{
bool startedOK = true;
try
{
RasHandle handle = null;
}
catch
{
startedOK = false;
OpenFileDialog op = new OpenFileDialog();
op.Filter = "DotRas.DLL File|DotRas.dll";
if (op.ShowDialog() == DialogResult.OK)
{
try
{
System.IO.File.Copy(op.FileName, Application.StartupPath);
startedOK = true;
}
catch { }
}
}
if (startedOK)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
System.Reflection.Assembly.LoadFrom("DotRas.dll");
Application.Run(new Form1());
}
else
MessageBox.Show("Some of Reference is missing");
}
ولی اگه اصرار بر استفاده از اون نمونه برنامه (به هر دلیلی) دارید میتونید از نمونه زیر کمک بگیرید

Collector
یک شنبه 25 تیر 1391, 10:33 صبح
ببین اول روشن کن منظورت runtime است یا designtime؟
اگر برنامه ات کامپایل میشه پس مشکلت runtime است. می خوای اگر dll نبود قبل باز شدن فرم پیام بده؟ خب می تونی توی فرم قبلی یا Program.cs کد چک کردن وجود یا عدم وجود فایل را بکار ببری:
System.Io.File.Exists

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



راستش رو بخوای اصلا نفهمیدم چی میخواید. اگر برنامه قبلا کد نویسی و کامپایل شده و شما در زمان اجرای برنامه میخواید ببینید تمام رفرنسها وجود دارند میتونید توی Program.cs در اولین خط Main با استفاده از try / catch از هر رفرنس یک کلاس رو ایجاد کنید اگر مشکلی نبود که هیچ در غیر اینصورت پنجره انتخاب فایل باز بشه و درخواست فایل dll رو کنه اونو کنار فایل اجرایی برنامه کپی کنه


از خط 6 در برنامه بالا که نوشتید تا وقتی که رفرنس اضافه نشه نمیشه استفاده کرد چون RasHandle یکی از کلاس های اون dll است.
مشکل اضافه کردن به رفرنس با اون برنامه ای که دادید حل شد.
الان این برنامه را نگاه کنید من اومدم از یک dll قبل از اینکه به رفرنس اضافه بشه استفاده کردم.
خواستم از شرط استفاده کنم بازم نشد. برای این چه راه حلی هست.

مرتضی تقدمی
یک شنبه 25 تیر 1391, 10:58 صبح
سلام
بعضی کامپوننتها هم هستند که اگر در برنامه ازشون استفاده کرده باشی و موقع اجرا کنار برنامه نباشند, برنامه کلا ارور میده (ارور run time نه. اون ارور donot send). این رو هم دقت داشته باشین.
موفق باشید

Collector
یک شنبه 25 تیر 1391, 12:22 عصر
سلام
بعضی کامپوننتها هم هستند که اگر در برنامه ازشون استفاده کرده باشی و موقع اجرا کنار برنامه نباشند, برنامه کلا ارور میده (ارور run time نه. اون ارور donot send). این رو هم دقت داشته باشین.
موفق باشید

الان دقیقا مشکل همین است. من از dll در برنامه استفاده کردم ولی اون الان کنار فایل اجرایی نیست همچنین به رفرنس اضافه نشده

saeedmassomi
چهارشنبه 28 مهر 1400, 21:12 عصر
با سلام
مشکلی داشتم چطور میتونم دوتا فایل dll با نام یکسان ولی با نسخه متفاوت رو در رفرنس ادد کنم مثلا دو تا dll مربوط به دو نسخه excel که که نامش یکسان هسنش به هنگام اضافه کردن پیغام خطای کانفلیگ موجود بودن فایل رو میده ...میشه یک نمونه سورس کامل رو قرار بدین ..

mehran6764
یک شنبه 02 آبان 1400, 19:08 عصر
با سلام
مشکلی داشتم چطور میتونم دوتا فایل dll با نام یکسان ولی با نسخه متفاوت رو در رفرنس ادد کنم مثلا دو تا dll مربوط به دو نسخه excel که که نامش یکسان هسنش به هنگام اضافه کردن پیغام خطای کانفلیگ موجود بودن فایل رو میده ...میشه یک نمونه سورس کامل رو قرار بدین ..


تو تاپیک بغلی هم خدمتتون عرض کردم dll نسخه پایین رو اد کنید ، در نسخه های بالای ویندوز کار می کنه

saeedmassomi
یک شنبه 13 شهریور 1401, 23:16 عصر
تو تاپیک بغلی هم خدمتتون عرض کردم dll نسخه پایین رو اد کنید ، در نسخه های بالای ویندوز کار می کنه
با سلام dll نسخه پایین خب جواب نمیده چون یک سری دستورات هست که توی dll نسخه جدید وجود داره و در نسخه های قبلی وجود نداره
پس این روش منطقی نیست
مثال در AutoCAD که dll های قدیمی جواب گوی نسخه های جدید اتو کد نیستن ... بهتر دنبال یه راهکار منطقی و اسای تر باشیم