الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف أغير مسار ملف Dll معمول به في برنامجي أثناء التشغيل .

مغلق
بدأه hid في 31 أغسطس 2007 · 8 رد · 1,042 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم . . .

أعمل على بعض ملفات الــ dll أثناء التصميم بعد أن قمت بإضافتها عن طريق Add References .

وقمت بجعل الخاصية Copy Local الموجودة في خصائصه على false .

حيث أنني أريد أن أحدد مسار ملف الــ dll بشكل ديناميكي دون أن يضعه الفيجول داخل مجلد البرنامج تلقائيا في حال وضعت القيمة trur على Copy Local

فكيف أستطيع تحديد المسار أثناء التشغيل .

هذه كانت محاولة :


try
{
loadedAssembly = Assembly.LoadFrom("C:\\dll\\myfunction.dll");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
			Assembly loadedAssembly = null;

لكنها بائت بالفشل ويعطيني رسالة عدم العثور على الملف المستدعى أثناء التصميم , لكن الملف المستعدى من خلال الدالة السابقة يكون سليما , ولكن البرنامج لا يعمل .

............

أتمنى أن يكون استفساري واضحا . . .

دمتم بخير .

#2
using System;
   using System.IO;
   using System.Collections.Generic;
   using System.ComponentModel;
   using System.Data;
   using System.Drawing;
   using System.Text;
   using System.Runtime.InteropServices;
   using System.Reflection;
   using System.Windows.Forms;

   namespace WindowsApplication13
   {
	   public partial class Form1 : Form
	   {
		   public Form1()
		   {
			   InitializeComponent();
		   }

		   private void Form1_Load(object sender, EventArgs e)
		   { //-------------- Path c:\\dll
			   try
			   {Assembly SampleAssembly;
			   SampleAssembly = Assembly.LoadFrom("C:\\dll\\ClassLibrary1.dll");
			   MethodInfo Method = SampleAssembly.GetTypes()[0].GetMethod("CreateFile");
			   ParameterInfo[] Params = Method.GetParameters();
			   string info = string.Empty;
			   foreach (ParameterInfo Param in Params)
			   {info = string.Format("Param={0}, Type={1}, Position={2},  Optional={3}",
				   Param.Name.ToString(), Param.ParameterType.ToString(), Param.Position.ToString(), Param.IsOptional.ToString());
				   MessageBox.Show(info);
			   }
			  }
			catch (Exception ex)
			   {
				   MessageBox.Show(ex.Message);
				   return;
			   }
		   //------------------- Path c:
			   try
			   {
				   Assembly SampleAssembly;
				   SampleAssembly = Assembly.LoadFrom("C:\\ClassLibrary1.dll");
				   MethodInfo Method = SampleAssembly.GetTypes()[0].GetMethod("CreateFile");
				   ParameterInfo[] Params = Method.GetParameters();
				   string info = string.Empty;
				   foreach (ParameterInfo Param in Params)
				   {
					   info = string.Format("Param={0}, Type={1}, Position={2},  Optional={3}",
							 Param.Name.ToString(), Param.ParameterType.ToString(), Param.Position.ToString(), Param.IsOptional.ToString());
					   MessageBox.Show(info);
				   }
			   }
			   catch (FileNotFoundException ex1) { MessageBox.Show(ex1.Message); }
			   // related exception types FileLoadException ,ArgumentException, ArgumentNullException, BadImageFormatException, System.Security.SecurityException
				   return;			

	   //--------------------
		   }
	   }
   }
#3

شكرا أخي العزيز لتجاوبك ,

ولكن للأسف فالكود السابق لم يعمل معي .

والسبب هو سوء فهمي .

ماغيرته في كودك هو path

و الـ method .

ولكن تظهر لي رسالة الــ catch

Object Reference not set to an instance of an Object

مع أني متأكد من وجود الــ method وهو نفسه الذي أستعمله أثناء التصميم , ويعمل بكفاءة .

#5

فكرة جيدة أخي hazzoom , لكن لوتنجح معي فقط !

شكرا لمرورك .

#6

أخي العزيز ben_laiid ...

لقد قمت بعمل مشروع منفصل لإنشاء ملف dll , ثم قمت باستدعائة بطريقتك , فنجحت معي .

لكن مقصدي (وآسف إن لم أشرح مشكلتي جيدا) مقصدي هو :

أنني أود العمل على ملف الــ dll أثناء التصميم عن طريق Add Reference

ومن المعلوم أن الفيجوال سي شارب يقوم بأخذ نسخة تلقائيا من ملف الــ dll المعمول به أثناء التصميم إلى مجلد البرنامج . مالم تضع القيمة false على خاصية Copy Loal والموجود في خصائص ملف الـ dll في قائمة الــ Reference .

أنا لا أود أن يأخذ الفيجوال سي نسخة إلى مجلد البرنامج , وبالتالي فإن البرنامج عند تشغيله سيفتقد ملف الـ dll ويقول أنه لا يجده , وهنا المشكلة

فأريد التحكم بعمليه الــ path الخاصة بملف الــ dll عند بداية تشغيل البرنامج فقط حتى لايقع الخطأ .

تم تعديل هذه المشاركة بواسطة hid في 2 سبتمبر 2007 في 01:25

#7

أظن انك تسأل عن ملف خارجي تخزن فيه مسارات ال dll مثل ال connection string

يمكنك استخدام الملف App.config و كل مشروع تستطيع ان تضيف اليه هذا الملف من add new item

و تستخدم xml tags لتخزين معلومات مختلفة مثل ال dll path

يوجد tags معينه لعمل ذلك

Specifying an Assembly's Location

#8

شكرا لك أخي العزيز أحمد على ردك .

حاولت بطريقتك لكنها لم تجدي معي , غير أني أرفقت لك المشروع , فإذا تمكنت من طريقة للحل فجزاك الله خيرا .

أي طريقة غير جعل Copy Local : true للملف في خصائصه على References .

WindowsApplication93.rar

تم تعديل هذه المشاركة بواسطة hid في 2 سبتمبر 2007 في 21:52

#9

حاول تجربها تاني

أو ابحث عنها في كتاب يوضحهالك اكتر

بس تأكد انها طريقة سهلة و مناسبة لمشكلتك

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…