다음을 통해 공유

C#에서 특정 offce 의 Excel 을 불러와서 사용할때 발생하는 0xC0000005 문제

Suh Changho 0 평판 포인트
2024-10-14T04:33:56.39+00:00

안녕하십니까?

C#으로 개발을 하고있는 개발자 입니다.

C# Winform 에서 Panel 을 이용하여 icrosoft.Office.Interop.Excel의 Excel Application을 생성하여 panel 과 연결하여 C#프로그램 안에서 Excel 을 제어하는 프로그램을 구성하였습니다.

개발중 특정 Office 버전(Office 2019 Pro 1808버전) 에서는 셀의 값을 변경하면 0xC0000005 에러를 발생시키며 Excel 프로세스가 종료되는 걸 확인하였습니다.

예전버전과 업데이트 둘다 해보았지만 해당 버전에서는 프로세스가 종료 됩니다.

해당 문제를 해결 할 수 있는 방법이 있을까요?

아래는 간단하게 구현한 프로그램입니다.

감사합니다.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System;

using System.Windows.Forms;

using System.Runtime.InteropServices;

using Excel = Microsoft.Office.Interop.Excel;

using System.Threading;

using System.Diagnostics;

using System.Security.Principal;

namespace ExcelPanelIntegration

{

    public partial class Form1 : Form

    {

        private Excel.Application excelApp;

        private Excel.Workbook workbook;

        private Excel.Worksheet worksheet;

        private Panel excelPanel;

        [DllImport("user32.dll")]

        private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

        [DllImport("user32.dll")]

        private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

        private const int SWP_NOZORDER = 0x4;

        private const int SWP_NOACTIVATE = 0x10;

        public Form1()

        {

            InitializeComponent();

            excelPanel = new Panel();

            excelPanel.Dock = DockStyle.Fill;

            this.Controls.Add(excelPanel);

            InitializeExcel();

        }

        private void InitializeExcel()

        {

            try

            {

                excelApp = new Excel.Application();

                workbook = excelApp.Workbooks.Add();

                worksheet = workbook.ActiveSheet;

                // Set Excel window as a child of our panel

                SetParent(new IntPtr(excelApp.Hwnd), excelPanel.Handle);

                // Resize Excel window to fit the panel

                SetWindowPos(new IntPtr(excelApp.Hwnd), IntPtr.Zero, 0, 0, excelPanel.Width, excelPanel.Height, SWP_NOZORDER | SWP_NOACTIVATE);

                // Make Excel visible

                excelApp.Visible = true;

                // Disable Excel's standard error handling

                excelApp.DisplayAlerts = false;

            }

            catch (COMException comEx)

            {

                MessageBox.Show($"COM Exception during Excel initialization: {comEx.Message}\nError Code: {comEx.ErrorCode:X}");

            }

            catch (Exception ex)

            {

                MessageBox.Show($"Error during Excel initialization: {ex.Message}");

            }

        }

        protected override void OnFormClosing(FormClosingEventArgs e)

        {

            base.OnFormClosing(e);

            CleanupExcel();

        }

        private void CleanupExcel()

        {

            try

            {

                if (worksheet != null)

                {

                    Marshal.ReleaseComObject(worksheet);

                    worksheet = null;

                }

                if (workbook != null)

                {

                    workbook.Close(false);

                    Marshal.ReleaseComObject(workbook);

                    workbook = null;

                }

                if (excelApp != null)

                {

                    excelApp.Quit();

                    Marshal.ReleaseComObject(excelApp);

                    excelApp = null;

                }

            }

            catch (Exception ex)

            {

                MessageBox.Show($"Error during Excel cleanup: {ex.Message}");

            }

            finally

            {

                GC.Collect();

                GC.WaitForPendingFinalizers();

            }

        }

    }

}

Microsoft Q&A
Microsoft Q&A
이 태그를 사용하여 제안, 기능 요청 및 버그를 Microsoft Q&A 팀과 공유합니다. Microsoft Q&A 팀은 정기적으로 피드백을 평가하고 그 과정에서 업데이트를 제공합니다.
질문 236개
댓글 0개 설명 없음
투표 {count}개

답변

질문 작성자가 수락한 답변이라고 답변에 표시할 수 있으며, 이를 통해 작성자의 문제를 해결한 답변을 사용자가 알 수 있도록 도와줍니다.