نقل قول نوشته شده توسط boveiryghasem مشاهده تاپیک
سلام

یه برنامه دارم که توی یک ListBox تعداد 300 آدرس فایل Excel دارم و میخام یکی یکی آدرسا رو بخونم و باز کنم فایل ها رو، بعدش که تغییرات لازم رو دادم اون فایل رو Save کنم و برم سراغ فایل بعدی تا آخر لیستی که از ListBox دارم، مشکل اینجاست که آخراش Error زیر رو میده کسی میدونه باید چکار کنم.

Transition into COM context 0x13c74a8 for this RuntimeCallableWrapper failed with the following error: System call failed. (Exception from HRESULT: 0x80010100 (RPC_E_SYS_CALL_FAILED)). This is typically because the COM context 0x13c74a8 where this RuntimeCallableWrapper was created has been disconnected or it is busy doing something else. Releasing the interfaces from the current COM context (COM context 0x13c73f0). This may cause corruption or data loss. To avoid this problem, please ensure that all COM contexts/apartments/threads stay alive and are available for context transition, until the application is completely done with the RuntimeCallableWrappers that represents COM components that live inside them.
اشیاء مدیریت شده داخل NET. که داخل متغیر هاتون دارید وقتی دیگه بهشون دسترسی نداشته باشید، توسط GC داخل NET. بصورت خودکار آزاد میشن، ولی اشیاء COM (ActiveX) که شما در برنامه تون استفاده می کنید مثل Workbook و Worksheet و سایر اشیاء ای که از اون Microsoft.Office.Interop.Excel بیرون می کشید رو باید قبل از رها کردن و سپردن دست GC به روش مناسب اشیاء COM آزاد کنید، وگرنه GC نمیتونه اون آزاد سازی بخش COM رو انجام بده، چون بهش مربوط نیست.

ابتدای کدتون System.Runtime.InteropServices رو Imports کنید و آخر کدتون هر چی شیء از Microsoft.Office.Interop.Excel مثل Workbook و Worksheet و Application دارید اگه اسم متغیرش varname باشه :
  • اول با Marshal.ReleaseComObject(varname) آزاد کنید.
  • دوم با varname = Nothing خالی کنید.

قبل از اینکه اینجور متغیر ها رو رها کنید یا مقدار دیگری داخل متغیرش قرار بدید باید حتما مقدار قبلی با اون دو تا مرحله آزاد بشه. دقت کنید که این وسط موردی رو جا نندازید.