טעינת dll ב- CLR

zahalul

New member
טעינת dll ב- CLR

שלום,
ב- run time עלי להחליט איזה קובץ dll לטעון.
זה אמור להחליף את הקוד הבא:
קוד:
char *pDeviceName = (char*)ptr.ToPointer();

			if (strcmp (pDeviceName , "Device1")==0)
			{
				m_pFioDevice = new CMyDevice1 (DeviceId);
			}
			if (strcmp (pDeviceName ,"Device2")==0)
			{
				m_pFioDevice = new CMyDevice2 (DeviceId);
			}
כיום אני נאלץ לבצע link עם 2 ספריות. אני לא רוצה לבצע link ולטעון בזמן ריצה.

תודה,
צהלול
 

nocgod

New member
אתה מבין אבל שהקוד שלך לא ישתנה אם תטען את ה DLLים בזמן ריצה

מה אתה מתכנן שישתנה?
תעשה Assembly.LoadFrom ל DLL רק תדאג להעתיק את הDLL בזמן ה BUILD למקום הנדרש

אני חושב שכדאי לך אולי לחשוב על המבנה של התוכנה שלך ואולי לחפש איך להשתמש ב design patterns קיימים כדי לטפל בבעיות שיש לך. נניח:
א. במהלך עליית התוכנה תטען את כל הDLLים מתיקית plugins כלשהי (בהנחה שיש סיבה לטעון אותם בצורה דינאמית ולא לעשות לינק סטאטי)
ב. מכל הAssemblies תחפש מחלקות שמממשות איזה IDeviceFactory ותרשום אותן בcontainer שלך (או תשתמש ב windsor castle+Installers ותדאג לעשות install לכולם בזמן העליה)
ג. Abstract Factory כדי לייצר את ה Devices שלך
ד. Dependency Injection כדי לקבל מערך של Factories עבור ה Devices
ה. לבחר Factory מתאים מהמערך באמצאות LINQ פשוט:
קוד:
var factory = _factories.SingleOrDefault(f => f.DeviceName.Equals(DeviceName));
var device = factory.Create(DeviceId);
קשה באמת לתת עצות מועילת כשלא מבינים מה המטרה הסופית של הקוד שלך.
למה אתה משתמש ב strcmp כלשהו במקום string.Equals?
למה אתה לא עושה Switch במקום הifים שלך?
למה אתה צריך מצביעים?
האם אתה באמת צריך לטעון דברים בצורה דינאמית? כי אם זו הכנה למזגן - הייתי מוותר.

בקיצור כדי להועיל באמת צריך לדעת את הסיבה להחלטות שלך. מכמה שורות הקוד שראיתי ההצעה הכי טובה שלי זה לעצור ולחשוב לפני שתוסיף עוד קוד.
 
למעלה