نوشته شده توسط
sima_2n5k
سلام من یه 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 هستش، اما روش در کل همینه.
موفق باشید.