PDA

View Full Version : دسترسی به کلاس از طریق dll



sima_2n5k
شنبه 30 مرداد 1389, 11:50 صبح
سلام
من یه dll دارم میخوام بدونه اضافه کردن به referenceهای سرویسم به کلاسه داخلش که یک bll هست دسترسی داشته باشم.
چون از سمت کلاینت نمی تونه فرم مربوطه رو باز کنه و از xml خطا میگیره و باید از xmlInclude استفاده کنم ولی نمی خوام dll به referenceها اضافه کنم.
اگه راهی بگید که بشه به کلاسهای داخل dll دسترسی پیدا کنم بدون اینکه به referenceها اضافه کنم ممنون می شم.

اَرژنگ
شنبه 30 مرداد 1389, 15:12 عصر
سلام
من یه dll دارم میخوام بدونه اضافه کردن به referenceهای سرویسم به کلاسه داخلش که یک bll هست دسترسی داشته باشم.
چون از سمت کلاینت نمی تونه فرم مربوطه رو باز کنه و از xml خطا میگیره و باید از xmlInclude استفاده کنم ولی نمی خوام dll به referenceها اضافه کنم.
اگه راهی بگید که بشه به کلاسهای داخل dll دسترسی پیدا کنم بدون اینکه به referenceها اضافه کنم ممنون می شم.
اگر فرض کنیم که این چیزی که بهش دی‌ال‌ال میگید در حقیقت یک دات‌نت اسمبلیه (اگر نیست از این خط به پائین را نخوانید).
استفاده کردن از رفلکشن و استفاده از پلاگینها را باید مطالعه کنید.

در ضمن اگر دلیلی برایه این احتیاج که بدانه استفاده از رفرانس بهش از کلاسها استفاده کنید را توضیح بدید شاید بتونیم مشکل اصلیتان را درک کنیم، چونکه چیزی که درخاست کردید با اینکه شدنی هست زحماتش به اینکه چه فایده‌ای میخواهید عایدتان بشه مشخص نیست.
یک روش دیگر که بیشتر مممکن است به کارتان بیاد استفاده از اینترفیسهاست ، به جایه استفاده از کلاسها.

mehdi.mousavi
شنبه 30 مرداد 1389, 21:59 عصر
سلام من یه dll دارم میخوام بدونه اضافه کردن به reference های سرویسم به کلاسه داخلش که یک bll هست دسترسی داشته باشم. چون از سمت کلاینت نمی تونه فرم مربوطه رو باز کنه و از xml خطا میگیره و باید از xmlInclude استفاده کنم ولی نمی خوام dll به referenceها اضافه کنم. اگه راهی بگید که بشه به کلاسهای داخل dll دسترسی پیدا کنم بدون اینکه به referenceها اضافه کنم ممنون می شم.

سلام.
شما دو راه دارید (با فرض به اینکه راه حل بهتری غیر از Dynamic Load اون Assembly نداشته باشید):



اون Assembly رو توسط Assembly.LoadFile لود کنید. بعد با استفاده از Type مورد نظر و با استفاده از کلاس Activator، کلاس مورد نظر خودتون رو با استفاده از متود CreateInstance، ایجاد کرده و متود / Property مورد نظر رو Call کنید. (البته کدی که برای اینکار باید بنویسید قدری کثیف هستش).
اگر از C#‎ 4.0 استفاده می کنید، می تونید بدین شکل عمل کنید:



Assembly asm = Assembly.LoadFile(@"d:\myAssembly.dll");
Type type = asm.GetType("WhateverNamespace.MyClass");
dynamic obj = Activator.CreateInstance(type);
int a = obj.MyProp + 1;

در کد فوق، ابتدا من Assembly مورد نظر رو با LoadFile لود می کنم. سپس تایپ اون کلاس مورد نظرم در Namespace مربوطه رو می گیرم و به CreateInstance میدم و مقدار بازگشتی رو در متغیری از نوع dynamic ذخیر می کنم. از اینجا به بعد، هر کاری روی obj که یک متغیر dynamic هستش انجام بدید، در Runtime نتیجه اش رو خواهید دید. بعنوان مثال، من MyProp رو که یک int برمیگردونه روی obj خودم Call کردم (حتی اگر Property یا Method ای رو جای MyProp بنویسید که وجود نداره، این مساله در Compile-Time با مشکل مواجه نمیشه و در Runtime هستش که نتیجه رو خواهید دید). انجام همین کار در C#‎ نسخه های قدیمی تر، مستلزم نوشتن کدهای Boilerplate هستش، اما روش در کل همینه.
موفق باشید.

akhavan_a
یک شنبه 23 آبان 1389, 11:48 صبح
سلام.
شما دو راه دارید (با فرض به اینکه راه حل بهتری غیر از Dynamic Load اون Assembly نداشته باشید):



اون Assembly رو توسط Assembly.LoadFile لود کنید. بعد با استفاده از Type مورد نظر و با استفاده از کلاس Activator، کلاس مورد نظر خودتون رو با استفاده از متود CreateInstance، ایجاد کرده و متود / Property مورد نظر رو Call کنید. (البته کدی که برای اینکار باید بنویسید قدری کثیف هستش).
اگر از C#‎‎ 4.0 استفاده می کنید، می تونید بدین شکل عمل کنید:


Assembly asm = Assembly.LoadFile(@"d:\myAssembly.dll");
Type type = asm.GetType("WhateverNamespace.MyClass");
dynamic obj = Activator.CreateInstance(type);
int a = obj.MyProp + 1;

در کد فوق، ابتدا من Assembly مورد نظر رو با LoadFile لود می کنم. سپس تایپ اون کلاس مورد نظرم در Namespace مربوطه رو می گیرم و به CreateInstance میدم و مقدار بازگشتی رو در متغیری از نوع dynamic ذخیر می کنم. از اینجا به بعد، هر کاری روی obj که یک متغیر dynamic هستش انجام بدید، در Runtime نتیجه اش رو خواهید دید. بعنوان مثال، من MyProp رو که یک int برمیگردونه روی obj خودم Call کردم (حتی اگر Property یا Method ای رو جای MyProp بنویسید که وجود نداره، این مساله در Compile-Time با مشکل مواجه نمیشه و در Runtime هستش که نتیجه رو خواهید دید). انجام همین کار در C#‎‎ نسخه های قدیمی تر، مستلزم نوشتن کدهای Boilerplate هستش، اما روش در کل همینه.
موفق باشید.

سلام
من دارم یه برنامه پلاگینی می نویسم وقتی dll پلاگینم را load می کنم و بعد می خواهم ازش instance بگیرم (همین کاری که شما اینجا گفتین)بنا به اینکه پلاگینم از نوع usercontrol یا windows.Form باشه 2 خطای زیر رو می گیرم :
اگر usercontrol باشد : exeption has been thrown by the target of an envocation
اگر windows.Form باشد :No parameterless constructor defined for this object

{
دستوری که سرش خطا می گیره اینه :
(object obj = System.Activator.CreateInstance(type

در ضمن من Visual studion 2010 ندارم که dynamic Type داشته باشم
لطفا من رو راهنمایی کنید ممنونم م م م م م

akhavan_a
دوشنبه 24 آبان 1389, 10:15 صبح
سلام
من دارم یه برنامه پلاگینی می نویسم وقتی dll پلاگینم را load می کنم و بعد می خواهم ازش instance بگیرم (همین کاری که شما اینجا گفتین)بنا به اینکه پلاگینم از نوع usercontrol یا windows.Form باشه 2 خطای زیر رو می گیرم :
اگر usercontrol باشد : exeption has been thrown by the target of an envocation
اگر windows.Form باشد :No parameterless constructor defined for this object

{
دستوری که سرش خطا می گیره اینه :
(object obj = System.Activator.CreateInstance(type

در ضمن من Visual studion 2010 ندارم که dynamic Type داشته باشم
لطفا من رو راهنمایی کنید ممنونم م م م م م

سلام مشکلم حل شد می گم که اگه کسی این error و داشت کمکش کنه : خود usercontrol ام با connectionstring اش مشکل داشت یعنی کلا اشکال وصل شدن به دیتابیس داشت.
فرم هم این ایراد و داشت که obj (آبجکتی که createinstance کرده بودم) را به فرم Cast نکرده بودم .:لبخندساده: