سؤال

أقوم بتشغيل Excel من تطبيق C# .NET وأواجه مشكلة في الحصول على العملية لإغلاقها. كيف يمكنني الحصول على عملية Excel لإغلاقها بشكل صحيح من برنامج C#؟

هل كانت مفيدة؟

المحلول

جرب هذا:

foreach (System.Diagnostics.Process process in System.Diagnostics.Process.GetProcessesByName("EXCEL"))
        {
            if (process.MainModule.ModuleName.ToUpper().Equals("EXCEL.EXE"))
            {
                process.Kill();
                break;
            }
        }

نصائح أخرى

أنا على يقين من 99 ٪ من أن مشكلتك ناتجة عن تعلق مراجع COM التي تمنع عملية Excel من الإغلاق. Excel عرضة لهذا الغرض بشكل خاص لأنها تميل إلى توليد مراجع COM بشفافية دون أن تمنحك الوسائل للحصول على مقابضهم وإغلاقها صراحة.

يضاعف PIAS هذه المشكلة من خلال إدخال مجموعة من الإشارات الخاصة بهم إلى كائنات COM الأساسية التي لا تنظفها إلا إذا قمت بتصريحها بشكل صريح. العمل مع Excel من خلال PIAS هو بذل جدا هذا السبب بالضبط.

Application.Quit() (IIRC هذا ما يسمى) إرادة أغلق العملية إذا تم تنظيف المراجع بشكل صحيح. هذا يعني أنه يتعين عليك إدارة دورة حياة أي شيء يحمل إشارات COM إلى عملية Excel والتأكد من تنظيف جميع مراجع COM بشكل صحيح.

Application app = new Application();
...
EndTask((IntPtr)app.Hwnd, true, true);

[DllImport("user32.dll")]
public static extern bool EndTask(IntPtr hwnd, bool shutdown, bool force);

اعتمادًا على احتياجاتك ، قد تفكر في استخدام جدول البيانات لـ .NET الذي يمنحك مكونًا متوافقًا مع Excel مع عدم وجود com interop (لا توجد مثيلات معلقة ، أو أداء أفضل ، لا داعي للقلق سواء تم تثبيت Excel أو إصدار Excel مثبت).

يمكنك رؤية عينات ASP.NET Live مع مصدر C# و VB هنا, ، تعرف على المزيد حول عناصر تحكم وعينات Windows في جدول البيانات هنا, وتنزيل تجربة مجانية هنا إذا كنت تريد أن تجربها بنفسك.

إخلاء المسئولية: أنا أملك جدول بيانات LLC

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top