Visual C#을 사용하여 Office 프로그램의 실행 중인 인스턴스를 자동화하는 방법

요약

이 단계별 문서에서는 Office 프로그램의 실행 중인 인스턴스에 대한 Automation 참조를 가져오는 Microsoft Visual C# 2005 또는 Microsoft Visual C# .NET 클라이언트를 만드는 방법을 보여줍니다.

Office 프로그램의 실행 중인 인스턴스를 자동화하는 Visual C# 2005 또는 Visual C# .NET 애플리케이션 만들기

Office를 자동화하는 클라이언트 프로그램은 해당 Office 프로그램의 새 인스턴스를 만들거나 이미 실행 중인 인스턴스에 대한 참조를 가져올 수 있습니다. 일반적으로 실행 중인 인스턴스에 연결하는 대신 새 인스턴스를 만드는 것이 좋습니다. 그러나 일부 시나리오에서는 클라이언트 프로그램이 이미 실행 중인 Office 프로그램 인스턴스를 자동화해야 합니다. 이 경우 Automation 클라이언트는 ROT(실행 개체 테이블)에서 Automation 서버의 COM(구성 요소 개체 모델) 개체에 대한 참조를 가져옵니다.

Automation 서버가 실행 중인 개체 테이블에 등록된 경우 .NET 클라이언트는 다음을 호출하여 실행 중인 인스턴스에 대한 참조를 가져올 수 있습니다.

System.Runtime.InteropServices.Marshal.GetActiveObject

-또는-

System.Runtime.InteropServices.Marshal.BindToMoniker

샘플 코드

  1. Microsoft Visual Studio 2005 또는 Microsoft Visual Studio .NET을 시작합니다. [파일] 메뉴에서 [새로 만들기]를 클릭한 다음 [프로젝트]를 클릭합니다. 프로젝트 형식에서 Visual C# 프로젝트를 클릭한 다음 템플릿 아래에서 Windows 애플리케이션을 클릭합니다. Form1은 기본적으로 만들어집니다.

    참고 Visual C# 2005에서 Visual C#프로젝트 대신 Visual C#을 클릭합니다.

  2. Microsoft Excel 개체 라이브러리 및 Microsoft Word 개체 라이브러리에 대한 참조를 추가합니다. 이렇게 하려면 다음과 같이 하십시오.

    1. 프로젝트 메뉴에서 참조 추가를 클릭합니다.

    2. COM 탭에서Microsoft Excel 개체 라이브러리를 찾은 다음 선택을 클릭합니다.

      참고 Visual C# 2005에서는 선택을 클릭할 필요가 없습니다.

      참고 Microsoft Office 2003에는 IA(기본 Interop 어셈블리)가 포함되어 있습니다. Microsoft Office XP에는 PIA가 포함되지 않지만 다운로드할 수 있습니다.

    3. Microsoft Word 개체 라이브러리를 찾은 다음 선택을 클릭합니다.

      참고 Visual C# 2005에서는 선택을 클릭할 필요가 없습니다.

    4. 참조 추가 대화 상자에서 [확인]을 클릭하여 선택 내용을 적용합니다.

  3. 보기 메뉴에서 도구 상자를 클릭하여 도구 상자를 표시합니다. Form1에 단추 3개와 텍스트 상자를 추가합니다. 다음과 같이 이러한 컨트롤의 텍스트를 입력합니다.

    ID 텍스트
    button1 Excel 인스턴스 실행에 대한 Automation 참조 가져오기
    button2 파일 모니커를 사용하여 Excel에 대한 Automation 참조 가져오기
    button3 셸 Word 및 Automation 참조 가져오기
    textBox1 저장된 xls 파일의 파일 이름을 입력합니다.
  4. 다음과 같이 단추 컨트롤의 Click 이벤트 처리기를 설정합니다.

    1. Button1을 두 번 클릭한 다음 보기 메뉴에서 디자이너를 클릭합니다.
    2. 단추2를 두 번 클릭한 다음 보기 메뉴에서 디자이너를 클릭합니다.
    3. Button3을 두 번 클릭합니다.
  5. 다음 코드를 Form1.cs의 맨 위에 추가합니다. 다른 using 문 다음에 추가합니다.

    using Excel = Microsoft.Office.Interop.Excel;
    using Word = Microsoft.Office.Interop.Word;
    
  6. 이벤트 처리기에 다음 코드를 추가합니다.

    private void button1_Click(object sender, System.EventArgs e)
    {
    
    //Excel Application Object
    Excel.Application oExcelApp;
    
    this.Activate();
    
    //Get reference to Excel.Application from the ROT.
    oExcelApp =  (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    
    //Display the name of the object.
    MessageBox.Show(oExcelApp.ActiveWorkbook.Name);
    
    //Release the reference.
    oExcelApp = null;
    }
    
    private void button2_Click(object sender, System.EventArgs e)
    {
    Excel.Workbook  xlwkbook;
    Excel.Worksheet xlsheet;
    
    //Get a reference to the Workbook object by using a file moniker.
    //The xls was saved earlier with this file name.
    xlwkbook = (Excel.Workbook)  System.Runtime.InteropServices.Marshal.BindToMoniker(textBox1.Text); 
    
    string sFile = textBox1.Text.Substring(textBox1.Text.LastIndexOf("\\")+1);
    xlwkbook.Application.Windows[sFile].Visible = true;
    xlwkbook.Application.Visible = true;
    xlsheet = (Excel.Worksheet) xlwkbook.ActiveSheet;
    xlsheet.Visible = Excel.XlSheetVisibility.xlSheetVisible;
    xlsheet.Cells[1,1] = 100;
    
    //Release the reference.
    xlwkbook = null;
    xlsheet = null;
    }
    
    private void button3_Click(object sender, System.EventArgs e)
    {
    Word.Application wdapp;
    
    //Shell Word
    System.Diagnostics.Process.Start("<Path to WINWORD.EXE>");
    
    this.Activate();
    
    //Word and other Office applications register themselves in 
    //ROT when their top-level window loses focus. Having a MessageBox 
    //forces Word to lose focus and then register itself in the ROT.
    
    MessageBox.Show("Launched Word");
    
    //Get the reference to Word.Application from the ROT.
    wdapp = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
    
    //Display the name.
    MessageBox.Show(wdapp.Name);
    
    //Release the reference.
    wdapp = null;
    }
    
    

    참고 button3_click()에서 Winword.exe경로를 Winword.exe 올바른 경로로 바꿉 있습니다. Microsoft Word의 기본 위치는 C:\Program Files\Microsoft Office\Office\Winword.exe.

  7. 빌드 메뉴에서 솔루션 빌드를 선택하여 애플리케이션을 빌드합니다.

애플리케이션 테스트

  1. F5 키를 눌러 애플리케이션을 빌드하고 실행합니다.
  2. 실행 중인 Excel 인스턴스를 모두 종료합니다.
  3. 새 통합 문서로 Excel을 시작합니다.
  4. Excel 인스턴스를 실행하려면 Automation 참조 가져오기 단추를 클릭합니다.
  5. 애플리케이션은 Excel의 기존 인스턴스에 대한 Automation 참조를 가져옵니다. Automation 참조는 button1_Click 대한 지역 변수 oExcelApp에 저장됩니다. 메시지 상자에는 현재 통합 문서의 이름이 표시됩니다.
  6. 통합 문서를 로컬 디스크에 저장합니다. 통합 문서를 Excel에서 열어 둡니다.
  7. textBox1의 이전 단계에서 저장한 통합 문서의 전체 경로와 파일 이름을 입력합니다.
  8. 파일 모니커를 사용하여 Excel에 대한 Automation 참조 가져오기 단추를 클릭합니다.
  9. 애플리케이션은 실행 중인 Excel 인스턴스에 대한 Automation 참조를 가져옵니다. Automation 참조는 지역 변수 xlwkbookfor button2_Click 저장됩니다. 현재 시트의 첫 번째 행과 첫 번째 열에 값 100이 입력됩니다.
  10. 통합 문서의 변경 내용을 저장하지 않고 Excel을 종료합니다.
  11. 파일 모니커를 사용하여 Excel에 대한 Automation 참조 가져오기 단추를 클릭합니다.
  12. Excel의 새 인스턴스가 만들어지고 이전에 저장된 통합 문서가 열립니다. 애플리케이션은 이 Excel 인스턴스에 대한 Automation 참조를 가져옵니다. Automation 참조는 button2_Click 대한 지역 변수 xlwkbook에 저장됩니다. 현재 시트의 첫 번째 행과 첫 번째 열에 값 100이 입력됩니다.
  13. Excel을 닫습니다.
  14. 셸 Word를 클릭하고 Automation 참조 가져오기 단추를 클릭합니다.
  15. 명령 프롬프트에서 시작한 것처럼 Word가 시작되고 Word 시작 메시지 상자가 표시됩니다. 메시지 상자를 표시하면 WM_SETFOCUS 메시지가 Word 프로그램 창으로 전송됩니다. 이렇게 하면 WORD에서 ROT(실행 중인 개체 테이블)에 등록할 수 있습니다.
  16. 메시지 상자를 닫습니다. 이 프로그램은 새로 시작된 Word 인스턴스에 대한 Automation 참조를 가져옵니다. Automation 참조는 button3_Click 대한 지역 변수 wdapp에 저장됩니다. Word.Application 개체의 이름을 보여 주는 메시지 상자가 표시됩니다.

참고 사항

COM 서버는 단일 컴퓨터에서 동시에 실행할 수 있는 서버의 인스턴스 수에 따라 다중 사용(단일 인스턴스) 또는 단일 사용(다중 인스턴스)으로 분류할 수 있습니다.

새 COM 개체에 대한 요청이 Multiuse(단일 인스턴스) COM 서버에 오면 서버는 .exe 파일의 인스턴스를 하나만 사용하여 해당 개체를 만듭니다. 새 COM 개체를 요청하는 클라이언트의 수에 관계없이 하나의 서버 .exe 프로세스만 있습니다. 단일 사용(다중 인스턴스) 서버에서 새 COM 개체에 대한 각 요청은 서버 .exe 파일의 별도 인스턴스를 시작합니다. 따라서 동일한 컴퓨터에서 둘 이상의 서버 인스턴스를 실행할 수 있습니다.

Word(Winword.exe), Excel(Excel.exe) 및 Microsoft Access(MSAccess.exe)의 여러 인스턴스를 동시에 실행할 수 있습니다. 따라서 이러한 서버는 일회용(다중 인스턴스) 서버로 정의됩니다. PowerPoint(Powerpnt.exe) 인스턴스는 언제든지 실행할 수 있습니다. 따라서 PowerPoint는 다중 사용(단일 인스턴스) 서버입니다.

COM 서버가 일회용(다중 인스턴스) 또는 다중 사용(단일 인스턴스)인지 여부는 GetActiveObject를 사용하여 해당 서버에 대한 참조를 가져오는 결정에 영향을 줄 수 있습니다. Word, Excel 또는 Microsoft Access 인스턴스가 둘 이상 실행될 수 있으므로 특정 서버의 GetActiveObject는 예상하지 못한 인스턴스를 반환할 수 있습니다. ROT에 처음 등록된 인스턴스는 일반적으로 GetActiveObject에서 반환되는 인스턴스입니다. Word, Excel 또는 Microsoft Access의 특정 실행 중인 인스턴스에 대한 Automation 참조를 가져오려면 해당 인스턴스에서 열린 파일의 이름과 함께 BindToMoniker를 사용합니다. PowerPoint와 같은 Multiuse(단일 인스턴스) 서버의 경우 자동화 참조가 동일한 실행 중인 인스턴스를 가리키기 때문에 중요하지 않습니다.

COM 서버는 시작 후 실행 중인 개체 테이블에 등록해야 합니다. Office 프로그램은 포커스가 끊어지면 자신을 등록합니다. 프로그램이 포커스를 잃기 전에 프로그램이 실행 중인 인스턴스에 연결하려고 하면 오류 메시지가 표시될 수 있습니다.

참조

GetActiveObject를 사용할 때 Office 프로그램의 다양한 동작에 대한 자세한 내용은 아래 문서 번호를 클릭하여 Microsoft 기술 자료의 문서를 확인합니다.

288902 정보: Office Automation 서버의 GetObject 및 CreateObject 동작에 대한 자세한 내용은 다음 MSDN(Microsoft Developer Network) 웹 사이트를 참조하세요.

Visual Studio를 사용한 Microsoft Office 개발