PDA

View Full Version : سوال: دسترسی به Dll های داخل Dll دیگر



MehdiElexal
پنج شنبه 13 فروردین 1394, 16:24 عصر
با سلام خدمت دوستان
یک Dll هست که میخوام Dll های دیگم داخلش AddRefrence کنم و همه جا نام یک Dll رو صدا کنم و چندین Dll به یک Dll تبدیل شه
فقط جای سوالم اینجاست که چطور از Dll هایی که اضافه شده استفاده کنم ؟( چطور public شن ؟ )

am_al_59
پنج شنبه 13 فروردین 1394, 16:31 عصر
یک راهش اینه که شما در اون dll اصلیتون توابعی رو با پارامترهای لازم برای دسترسی به سایر dll ها بنویسید
در این روش در برنامه های دیگه نیازی به reference دادن به سایر dll ها نیست و فقط از طریق همون dll اصلی و با توابعی که تعریف کردین می توانید به سایر dll ها دسترسی داشته باشید
البته توجه کنید که در این روش تمامی فایل های dll استفاده شده باید در مسیر جاری یا مسیرهای تعیین شده برای جستجوی کتابخانه ها وجد داشته باشند

راه دیگش هم برای مواقعیه که شما نمیخواهید چندین فایل dll در آدرس برنامه یا سایر آدرس های مورد جستجو قرار بدین
در این روش شما بطور عادی در برنامه اصلی از سایر dll ها استفاده می کنید و در انتها پس از کامپایل با نرم افزارهای مربوط به pack و bind تمامی فایل ها رو در فایل اجراییتون به یکی از دو صورت embded یا merge ضمیمه کنید

MehdiElexal
پنج شنبه 13 فروردین 1394, 16:37 عصر
نه مهندس میخوام یک Dll باشه بعد سایر Dll ها Addrefrence بشن ، نمیخوام توابع رو بریزم میخوام خود دی ال ال استفاده شه
DLL2 & DLL3 داخل پروژه Dll1 اضافه شدن بصورت addrefrence
حالا با using Dll1 چطور به توابع Dll2 & 3 دسترسی داشته باشم؟
شایدم من منظورتون رو متوجه نشدم در صورت امکام مثال بزنید.
تشکر

am_al_59
پنج شنبه 13 فروردین 1394, 16:44 عصر
من همون دوتا راه رو بلد بودم

یک راه دیگه هم هست که بدون reference دادن به یک dll در زمان runtime اونو در برنامه لود کنی که کدش این میشه

Assembly.Load(AssemblyName.GetAssemblyName("LibraryFileName"));

که فکر نکنم منظور شما این باشه

این لیک کاری که شما میخوای بکنی رو با تصویر شرح داده
http://stackoverflow.com/questions/12826084/how-to-access-namespaces-in-a-dll-via-another-dll

MehdiElexal
پنج شنبه 13 فروردین 1394, 16:50 عصر
منظور من اینه دوست عزیز
Dll1=>Add refrence=>Dll2& Dll3
داخل Dll2 تابع A و داخل Dll3 تابع B قرار داره
حالا میخوام با using کردن Dll1 به توابع A,B دسترسی داشته باشم :)

MehdiElexal
پنج شنبه 13 فروردین 1394, 17:28 عصر
من همون دوتا راه رو بلد بودم

یک راه دیگه هم هست که بدون reference دادن به یک dll در زمان runtime اونو در برنامه لود کنی که کدش این میشه

Assembly.Load(AssemblyName.GetAssemblyName("LibraryFileName"));

که فکر نکنم منظور شما این باشه

این لیک کاری که شما میخوای بکنی رو با تصویر شرح داده
http://stackoverflow.com/questions/12826084/how-to-access-namespaces-in-a-dll-via-another-dll


مهندس خوندم ولی متوجه نشدم . شما مثالی چیزی نداری از این کار ؟
با use کردن زیر توابع نمیاد برای من
تشکر

am_al_59
پنج شنبه 13 فروردین 1394, 17:41 عصر
شما یک برنامه داری که اسمشو میزاریم App
یک کتابخانه اصلی داری که اسمشو میزاریم DllMain
در این کتابخانه یک تابع هست به اسم DllMainMethod و نوعش هم Public هست

یک کتابخانه فرعی داری که اسمشو میزاریم DllSub
در این کتابخانه هم یک تابع هست به اسم DllSubMethod و نوعش هم Public هست

فرض میکنیم هر دو متد در ساده ترین حالت بدون پارامتر و Void هستن

حالا شما در DllMain یک Reference دادی به DllSub و به همه توابعش دسترسی داری
بعد در App هم Reference دادی به DllMain فقط

تا اینجا App به DllMain دسترسی داره و DllMain هم به DllSub
اما App چون هیچ Reference به DllSub نداره پس به تابع DllSubMethod هم دسترسی نداره

برای اینکه بتونی بدون Reference دادن (چه در حالت تعریف پروژه چه در Runtime) به DllSub در App بتونی از تابع DllSubMethod استفاده کنی
باید در DllMain یک تابع تعریف کنی مثلاً به اسم DllMainSubMethodBridge با نوع Public و در اون متد DllSubMethod رو فراخونی کنی
سپس در App با اینکه به DllSub دسترسی نداری میتونی با فراخوانی DllMainSubMethodBridge که در DllMain وجود داره و App هم بهش Reference داره از تابع DllSubMethod استفاده کنی

MehdiElexal
پنج شنبه 13 فروردین 1394, 17:49 عصر
شما یک برنامه داری که اسمشو میزاریم App
یک کتابخانه اصلی داری که اسمشو میزاریم DllMain
در این کتابخانه یک تابع هست به اسم DllMainMethod و نوعش هم Public هست

یک کتابخانه فرعی داری که اسمشو میزاریم DllSub
در این کتابخانه هم یک تابع هست به اسم DllSubMethod و نوعش هم Public هست

فرض میکنیم هر دو متد در ساده ترین حالت بدون پارامتر و Void هستن

حالا شما در DllMain یک Reference دادی به DllSub و به همه توابعش دسترسی داری
بعد در App هم Reference دادی به DllMain فقط

تا اینجا App به DllMain دسترسی داره و DllMain هم به DllSub
اما App چون هیچ Reference به DllSub نداره پس به تابع DllSubMethod هم دسترسی نداره

برای اینکه بتونی بدون Reference دادن (چه در حالت تعریف پروژه چه در Runtime) به DllSub در App بتونی از تابع DllSubMethod استفاده کنی
باید در DllMain یک تابع تعریف کنی مثلاً به اسم DllMainSubMethodBridge با نوع Public و در اون متد DllSubMethod رو فراخونی کنی
سپس در App با اینکه به DllSub دسترسی نداری میتونی با فراخوانی DllMainSubMethodBridge که در DllMain وجود داره و App هم بهش Reference داره از تابع DllSubMethod استفاده کنی
تشکر مهندس اما بازم یک تابع رو دسترسی دارم نه کل Dll رو من کل Dll رو میخوام اگر بحث یک تابع بود فقط که سرم درد نمیکرد :دی
میخوام اگر بشه کل Dll رو بتونم زیز توابعش رو استفاده کنم

MehdiElexal
پنج شنبه 13 فروردین 1394, 18:18 عصر
کسی نیست نظری بده ؟! کمک کنید گیر کردم جای حساس برنامه

MehdiElexal
پنج شنبه 13 فروردین 1394, 19:54 عصر
دوستان اگر کسی نظری چیزی داره ممنون میشم از نظراتتون استفاده کننم
برنامم تموم شده فقط مونده این دی ال ال ها
تشکر

drsina
جمعه 14 فروردین 1394, 01:02 صبح
ILMerge دوتا دی ال ال یا exe ، که Managed هست را بهم متصل میکنه اگرم یه دی ال ال هات دات نتی نیست یعنی unmanaged هست ، اول با tlbimp تبدیلش کن.
اینا همش توو Developer Command Prompt هست .
مثال :
tlbimp first.dll /out:Csharp.dll

برای ILMerge :

ilmerge /target:winexe /out:SelfContainedProgram.exe
Program.exe ClassLibrary1.dll ClassLibrary2.dll


برای اطلاعات بیشتر :http://www.codeproject.com/Articles/9364/Merging-NET-assemblies-using-ILMerge