PDA

نسخه کامل مشاهده نسخه کامل : [سوال] - اضافه کردن رفرنس به پروژه VB.Net و Copy Local و مفاهیم مربوط به آن



vb.civil
31-01-2018, 11:08
سلام دوستان

من یه پروژه با vb.Net نوشتم و از یک Dll به صورت Copy Local = True استفاده کردم به عنوان رفرنس و رو سیستم خودم درست کار میکنه (این پروژه خودش یه Dll هست که از یه Dll دیگه به عنوان رفرنس استفاده میکنه)
این Dll رفرنس در سیستم کاربر مطمئنا نصب هست ولی ممکنه در مسیر های متفاوتی باشه
تو اینترنت سرچ کردم مفاهیمی مثل Global Assembly Cache پیدا کردم ولی اصلا متوجه نشدن چیه ؟
کسی میتونه راجع به این موضوع راهنمایی کنه ؟ Global Assembly Cache

_H2_
10-02-2018, 02:22
سلام
در سالهای طولانی برنامه نویسی، فایل های dll گونه های مختلفی پیدا کرده اند...
در حال حاضر
- برخی dll ها برای کارکردن باید در کنار exe (یا دایرکتوری appdomain) یا در system32 باشند.
- برخی dll ها که از تکنولوژی COM استفاده میکنند باید در رایانه مقصد نصب شوند.
- اما dll های خود دات نت باید یا در کنار exe (یا دایرکتوری appdomain) و یا در GAC باشند.
(Global Assembly Cache)

اگر dll ای که شما از آن استفاده میکنید، خودش با دات نت نوشته شده باشد، شامل مورد سوم میشود.
شما میتوانید بسادگی هر دو dll را (آن یکی و مال خودتان) را کنار exe یا شاخه bin وب کپی کنید تا کار کنند.

اما در مورد GAC:
==========
یک پوشه خاص در ویندوز است، که dll های پرمصرف و اصلی دات نتی را بصورت نسخه بندی شده و کامپایل شده نگه داری میکند.
زمانی خیلی در مرکز توجه بود، ولی در حال حاضر، دیگر زیاد مورد توجه و استفاده مستقیم برنامه نویسان قرار ندارد.
در مواردی مانند تکنولوژی جدید dotNetCore که توانایی اجرا در سیستم عامل های مختلف را دارد، دیگر اصلا GAC مطرح نیست.
درهرصورت...

محل نگه داری این فایل های GAC در C:\Windows\assembly است.
این یک سیستم فولدر خاص است و پوشه عادی نیست و شما واقعا داخلش را به آن صورتیکه است، نمی بینید.
با درگ یک فایل dll و کپی آن به این پوشه میتوانید dll مذکور را در GAC نصب کنید، که این شامل کامپایل و طبقه بندی نسخه ای هم میشود.
همچنین با خط فرمان ngen.exe میتوانید یک dll را با کد (و مثلا طی مراحل setup) در GAC نصب کنید.

CLR قبل از اجرا برنامه تان ، وابستگی های dll آن را استخراج و بارگذاری میکند.
و اولین جایی که دنبال تامین این وابستگی جستجو میکند، درون GAC است.
و سپس در کنار exe (یا شاخه کاری appdomain) را جستجو میکند.
و...

بودن فایل در GAC به دلیل بهینه سازی برای cpu مورد نظر ، میتواند بسیار اندک موجب افزایش سرعت بالا آمدن اولیه برنامه تان شود. (ولی در سرعت اجرا بعدی برنامه تاثی
ولی درعین حال همانطورکه عرض کردم، GAC دیگر مورد توجه نیست و برنامه ها ترجیح میدهند dll های دات نتی شان را کنار خودشان نگه داری کنند.
(اینطوری نصب و لغو نصب و بروزرسانی و حتی اشکال یابی ساده تر خواهد بود)



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

vb.civil
26-02-2018, 13:04
مرسی دوست عزیز بابت توضیحات کامل

Dll ی که Dll من بهش وابسته هست خودش با دات نت نوشته شده . . .

الان یه جورایی با کپی کردنش کنار Dll حودم مشکل حل شده ولی بعضی وقتا یه اتفاقات عجیبی میافته . . .

مثلا بعضی از مخاطبان من حدود 20 درصدشون با اینکه Dll رفنس کنار Dll من هست میگند اجرا نمیشه ولی حدود 80 درصد از مخاطبان مشکلی نداشتند


اما تجربه خودم که دلیلی براش پیدا نکردم
فایل Dll رفرنس و Dll خودم در یک دایرکتوری کپی میکنم و اجرا میکنم
بعد از اولین اجرا دیگه Dll خودم رو هر جا کپی کنم کار میکنه این یعنی بعد از یک بار اجرای موفق یه جایی سیو میشه مسیر Dll رفرنس و دیگه لازم نیست کنار Dll خودم باشه !!! و تا زمانی که Dll رفرنس سر جای اولیه اش باشه مشکلی ندارم