C# 으로 오토메이션 만든걸 빌드하는 법좀 알려주세요.

안녕하세요.
C# 으로 만든 코드를 빌드하는 방법을 몰라서 문의 드립니다. (C# 완전초보입니다.)
개발환경은
윈도우11 / 비주얼스튜디오2022 / C# / 아래한글 Neo 입니다.
새프로젝트는 Windows Forms 앱(.NET Framework 4.7.2) 로 만들었습니다.
HwpObject 1.0 Type Library 도 참조추가 하였습니다.

코드는 아주 간단한 윈폼에서 버튼을 누르면 이미 열려있는 아래한글 문서에 글자를 쓰는겁니다.
(포럼 눈동냥으로 혼자 끙끙대면서 만들어봤습니다.)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices.ComTypes;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HwpObjectLib;

namespace 간단폼_빌드
{
    public partial class Form1 : Form
    {
        [DllImport("ole32.dll")]
        static extern int CreateBindCtx(uint reserved, out IBindCtx ppbc);
        [DllImport("ole32.dll")]
        private static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // get Running Object Table ...
            IRunningObjectTable Rot;
            GetRunningObjectTable(0, out Rot);

            // get enumerator for ROT entries
            IEnumMoniker monikerEnumerator = null;
            Rot.EnumRunning(out monikerEnumerator);

            IntPtr pNumFetched = new IntPtr();
            IMoniker[] monikers = new IMoniker[1];

            IBindCtx bindCtx;
            CreateBindCtx(0, out bindCtx);
            string name;

            while (monikerEnumerator.Next(1, monikers, pNumFetched) == 0)
            {
                monikers[0].GetDisplayName(bindCtx, monikers[0], out name);

                if (name.CompareTo("!HwpObject.96.1") == 0)
                {
                    IHwpObject hwp;
                    object obj;
                    Rot.GetObject(monikers[0], out obj);
                    hwp = (IHwpObject)obj;

                    var act = hwp.CreateAction("InsertText");
                    var pset = act.CreateSet();
                    string text = "버튼을 눌렀습니다.";
                    pset.SetItem("Text", text);
                    act.Execute(pset);
                    hwp.Run("BreakPara"); // 문단 나누기 (엔터)
                }
            }
        }
    }
}

비주얼스튜디오 에서 실행 하였을경우 아래 그림처럼 잘 작동을 합니다.

이것을 다른 pc 에서 사용하기 위해 솔루션 빌드를 누르면

이런식으로 Debug 폴더에 파일이 생김니다.

이게 정상적으로 빌드가 된게 맞나요?

제 목표는 dll 파일 포함한 단일 exe 파일로 빌드 하는건데 구글링, gpt 등등 검색해봐도 힘드네요.
gpt 는 Costura.Fody 를 사용하여 빌드해보라고 하는데 시키는데로 해도 단일파일 exe 로는 안나오네요.
C#이 처음이다 보니 너무 초보적인 질문인거 같아서 민망합니다.

안녕하세요

HwpOjectLib dll의 "Interop 형식 포함"옵션을 True로 설정하셨으면 exe 파일에 같이 포함됩니다.
Interop 적용 여부는 해당 프로젝트의 참조에서 HwpOjectLib의 속성을 보면 확인하실 수 있습니다.

감사합니다

안녕하세요.
일단 exe 파일을 바탕화면, 또는 다른 컴에 복사해서 실행했을 때 실행이 되면 단독으로도 보급이 가능한 거구요.
만약 실행이 안 되면, '게시’라는 메뉴에서 게시하는 절차를 거치면 됩니다.

1개의 좋아요

답변감사합니다.

HwpOjectLib dll의 "Interop 형식 포함"옵션을 True 적용이 아래처럼 되면 되는건가요?

그리고 GPT 에 물어보니 ILSpy.exe 열어보면 포함된 DLL 확인 가능하다 해서 확인해보니 아래처럼 나옵니다.

이렇게 되어 있으면 HwpOjectLib 이 포함되어 있는건가요?

네 포함된 것 같은데
혹시 다른 문제가 있으신가요?

ㅠㅠ 다른 pc에서 실행해봤는데 아래와 같은 오류가 뜨네요..

간단폼_빌드.exe
간단폼_빌드.exe.config
간단폼_빌드.pdb

3개다 복사하고 해도 같은 에러가 뜹니다.

관리자권한 CMD 로 한글경로에서 hwp.exe -regserver 를 해주고 해도 마찬가지네요. ㅠㅠ

혹시 참조를 아래 그림에 있는 HwpCtrl ACtiveX Control module 도 해줘야 하는건가요?

자문 자답입니다.
포럼 찾아보다가 2014는 hwp.exe -regserver 대신 hwp.exe -Regserver 처럼 대문자로 해야 한다해서
2016 NEO 도 혹시나 해서 대문자로 해봤더니 잘 작동합니다. ㅠㅠ
한참을 고생했는데 이렇게 허무할줄은… ㅎㅎ
댓글 달아주신분들 감사합니다.

3개의 좋아요