PDA

View Full Version : بارگزاری DLL از محلی دیگر



omid-vbAuto
چهارشنبه 01 دی 1389, 14:57 عصر
دوستان عزیز سلام :لبخندساده:


حتما تا حالا از dll ها تو برنامتون استفاده کردین.و می دونیم که برای استفاده از Dll ها باید کنار فایل EXE پروژمون باشه.

حالا من می خوام برنامم DLL رو از محل به غیر از مکان اشاره شده DLL بخونه.به طور مثال برنامه بره از فلان درایو و فلان پوشه DLL تو خودش لود کنه.و یا بطور مثال DLL های لازمشو بریزه تو System32 ویندوز.

با تشکر- منتظر هر نظر و پاسخی هستم.

omid-vbAuto
چهارشنبه 01 دی 1389, 19:52 عصر
دوستان عزیز لطفا کمک کنند.مرسی

آقای Alimanam یه کمکی بکنید بد نمیشه:چشمک:

Navid Asadi
چهارشنبه 01 دی 1389, 21:23 عصر
تو تاپیک های من بگرد جوابت رو به صورت کامل پیدا می کنی

omid-vbAuto
چهارشنبه 01 دی 1389, 22:11 عصر
تو تاپیک های من بگرد جوابت رو به صورت کامل پیدا می کنی

رفتم تاپیکاتو دیدم . به کد زیر بر خوردم که خطا داد.می تونی بگی کجا باید از این استفاده کنم؟ اگه نمونه برنامه بدی عالی میشه.




loadedAssembly = Assembly.LoadFile("C:\Folder\AssemblyName.dll")

omid-vbAuto
پنج شنبه 02 دی 1389, 17:11 عصر
دوستان لطفا کمک کنید.

Navid Asadi
پنج شنبه 02 دی 1389, 19:37 عصر
تو اون تاپیک یه لینک به MSDN هست توضیح کامل داده!
راستی بگو میخوای چیکار کنی؟
شاید راه ساده تر و بهتری از این کاری که میخوای بکنی باشه؟

omid-vbAuto
پنج شنبه 02 دی 1389, 19:52 عصر
تو اون تاپیک یه لینک به MSDN هست توضیح کامل داده!
راستی بگو میخوای چیکار کنی؟
شاید راه ساده تر و بهتری از این کاری که میخوای بکنی باشه؟

نوید جان مرسی که پاسخ دادین.

آره انهم دیدم اما متاسفانه نتونستم ازش استفاده ای بکنم :گریه:

هدف من اینه که از DLL هائی که تو برنامه ازشون استفاده کردم در معرض دید کاربر نباشه.فک کن ما از یه dll برا برناممون استفاده کردیم می خوام این Dll هنگام نصب بره داخل System32 ویا هر جای دیگه ای به غیر از کنار فایل EXE برناممون.بعد برنامه از اون محل خاص DLL رو برا خودش Load کنه.

اگه نمونه برنامه بدی لطف کردی.

vcldeveloper
جمعه 03 دی 1389, 00:35 صبح
هدف من اینه که از DLL هائی که تو برنامه ازشون استفاده کردم در معرض دید کاربر نباشه.فک کن ما از یه dll برا برناممون استفاده کردیم می خوام این Dll هنگام نصب بره داخل System32 ویا هر جای دیگه ای به غیر از کنار فایل EXE برناممون.بعد برنامه از اون محل خاص DLL رو برا خودش Load کنه.
برای مسیرهای عمومی مثل پوشه Windows یا System32، لازم نیست مسیر رو کامل ذکر کنید، فقط اسم فایل کفایت میکنه. همین که اسم فایل DLL رو بنویسید، ویندوز در مسیرهایی که در PATH تعریف شدند، دنبالش میگرده، و اگر DLL شما در یکی از اون مسیرها باشه، پیداش میکنه. اما وقتی DLL ایی رو در همچین پوشه های عمومی کپی می کنید، باید توجه داشته باشید که:

اولا، ندادن مسیر کامل فایل DLL کار شما را برای لود کردن DLL آسون میکنه، اما اگر در مسیرهایی که ویندوز به دنبال DLL شما میگرده، اگر فایل DLL ایی هم نام DLL شما وجود داشته باشه، و اون مسیر قبل از مسیر مورد نظر شما جستجو بشه، ویندوز سعی میکنه همون DLL رو لود کنه. در همچین شرایطی، در بهترین حالت یک پیام خطا دریافت می کنید و متوجه میشید که یک جای کار گیر داره. در بدترین حالت، ممکنه یک بد افزار از طریق با گول زدن برنامه شما، برنامه شما رو مجبور به اجرای کدهای مخرب خودش بکنه. اینطوری میتونه تحت نام برنامه شما به خرابکاری خودش بپردازه. اگر هم خرابکاری لو بره، برنامه شما مقصر شناخته میشه.

دوما، اگر چند نرم افزار در داخل سیستم از همون DLL استفاده کنند، و هر کدومشون هم سعی کنند در زمان نصب، نسخه مورد علاقه خودشان از اون DLL را در یک مسیر عمومی نصب کنند، اون وقت شما ممکنه دچار DLL Hell بشید.

سوما، اگر برنامه شما یک نرم افزار 32 بیتی هست، و ممکنه در سیستم عامل های 64 بیتی هم اجرا بشه، باید حواستون باشه که محل بعضی پوشه های عمومی مثل System32 برای نرم افزارهای 32 بیتی و 64 بیتی در یک سیستم عامل 64 بیتی فرق میکنه؛ یعنی مسیری که برنامه 32 بیتی شما به عنوان آدرس System32 از ویندوز دریافت میکنه، با مسیری که یک برنامه 64 بیتی روی همون سیستم دریافت میکنه، یکسان نیست.

omid-vbAuto
جمعه 03 دی 1389, 06:01 صبح
برای مسیرهای عمومی مثل پوشه Windows یا System32، لازم نیست مسیر رو کامل ذکر کنید، فقط اسم فایل کفایت میکنه. همین که اسم فایل DLL رو بنویسید، ویندوز در مسیرهایی که در PATH تعریف شدند، دنبالش میگرده، و اگر DLL شما در یکی از اون مسیرها باشه، پیداش میکنه. اما وقتی DLL ایی رو در همچین پوشه های عمومی کپی می کنید، باید توجه داشته باشید که:

اولا، ندادن مسیر کامل فایل DLL کار شما را برای لود کردن DLL آسون میکنه، اما اگر در مسیرهایی که ویندوز به دنبال DLL شما میگرده، اگر فایل DLL ایی هم نام DLL شما وجود داشته باشه، و اون مسیر قبل از مسیر مورد نظر شما جستجو بشه، ویندوز سعی میکنه همون DLL رو لود کنه. در همچین شرایطی، در بهترین حالت یک پیام خطا دریافت می کنید و متوجه میشید که یک جای کار گیر داره. در بدترین حالت، ممکنه یک بد افزار از طریق با گول زدن برنامه شما، برنامه شما رو مجبور به اجرای کدهای مخرب خودش بکنه. اینطوری میتونه تحت نام برنامه شما به خرابکاری خودش بپردازه. اگر هم خرابکاری لو بره، برنامه شما مقصر شناخته میشه.

دوما، اگر چند نرم افزار در داخل سیستم از همون DLL استفاده کنند، و هر کدومشون هم سعی کنند در زمان نصب، نسخه مورد علاقه خودشان از اون DLL را در یک مسیر عمومی نصب کنند، اون وقت شما ممکنه دچار DLL Hell بشید.

سوما، اگر برنامه شما یک نرم افزار 32 بیتی هست، و ممکنه در سیستم عامل های 64 بیتی هم اجرا بشه، باید حواستون باشه که محل بعضی پوشه های عمومی مثل System32 برای نرم افزارهای 32 بیتی و 64 بیتی در یک سیستم عامل 64 بیتی فرق میکنه؛ یعنی مسیری که برنامه 32 بیتی شما به عنوان آدرس System32 از ویندوز دریافت میکنه، با مسیری که یک برنامه 64 بیتی روی همون سیستم دریافت میکنه، یکسان نیست.






مهندس دستتون درد نکنه توضیحات کامل و پر مغزی دادین.:تشویق:


حالا می تونید ما رو در زمینه ی کد هم راهنمائی کنید؟

1-کدی که باعث میشه DLL ها به پوشه System32 و یا Windows کپی بشوند -- و کدی که این DLL های کپی شده رو مشخصا صدا بزنه.

2- کدی که باعث میشه DLL به یه پوشه عادی با نام دلخواه در فلان درایو کپی بشه--وکدی که این DLL های کپی شده رو مشخصا صدا بزنه.


با تشکر از راهنمائیتون.

vcldeveloper
جمعه 03 دی 1389, 18:15 عصر
حالا می تونید ما رو در زمینه ی کد هم راهنمائی کنید؟
من دات نت کار نمی کنم، پس نمی تونم کمک بخصوصی درباره نوشتن کد بهتون بکنم. تا جایی که میدونم، شما باید اول مشخص کنید که DLL شما Managed هست یا Unmanaged. اگر Managed هست، باید بتونید از طریق Reflection بهش دسترسی پیدا کنید. جزئیاتش را اطلاع ندارم، اما علاوه بر اون، در لینک زیر روش های مختلف لود کردن یک Assembly از مسیری غیر از مسیر فایل EXE توضیح داده شده:
http://support.microsoft.com/kb/837908

برای لود کردن یک DLL که unmanaged هست (مثل DLLهای ویندوز)، شما می تونید از خصیصه DllImport استفاده کنید، اما این حالت لود کردن Static هست. برای لود کردن DLL به صورت Dynamic باید توابع LoadLibrary و FreeLibrary و GetProcAddress موجود در kernel32.dll را Import کنید، و سپس به وسیله LoadLibrary فایل DLL مورد نظرتان را لود کنید (یک پارامتر میگیره که نام فایل DLL مورد نظر شما ست)، و با استفاده از GetProcAddress، آدرس تابع مورد نظرتان در آن DLL را به دست بیارید، و آن را فرخوانی کنید. در نهایت هم باید با فراخوانی FreeLibrary، اون DLL را Unload کنید. یک مثال برای انجام این کار در لینک زیر هست:
http://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx

اگر میخواید درباره نحوه کار توابع LoadLibrary یا FreeLibrary یا GetProcAddress اطلاعاتی به دست بیارید، می تونید به لینک مربوط به هر کدام از این توابع API ویندوز در MSDN مراجعه کنید. دقت کنید که استفاده از DLL های Unmanaged و فراخوانی توابع API ویندوز باعث میشه که برنامه دات نت شما محدود به پلت فرم ویندوز بشه، یعنی اگر زمانی تصمیم گرفتید که این برنامه را به پلت فرم دیگه ایی منتقل کنید، این وابستگی ها باعث میشند که نتونید به راحتی برنامه را به پلت فرم دیگه منتقل کنید.