.NET(c#,vb로 구성된) excel add-in추가기능을(xll확장자) WPF와 하나의 솔루션에서 관리하고, 앱 배포도 가능한지요?

  • 무엇을 하고자 하는지
    ; 현재 사용하는, 엑셀Addin추가기능 XLL 솔루션에 WPF 프로젝트를 추가하고 싶습니다. 그리고 사용자가 편하게 설치하게 끔 하는 배포? 절차를 추가 하고 싶습니다.

  • 현재 작성한 코드 중 문제가 되는 부분
    ; c# 을 디버깅은 해봤지만, 배포?라는 걸 (설치 자동으로 되는 걸) 해본 적이 없습니다.
    방향성을 전혀 몰라서, 간략하게나마 방향성이라도 알려주시면 거기로 열심히 파보려고 합니다.

  • 기대하는 동작
    설치(배포)하는 프로그램 exe를 클릭하면

    1. xll파일이 원하는 폴더에 설치되고 (이건 찾아보면 할 수 있을 것 같습니다)
    2. 계산기앱처럼 만들, WPF 앱도 xll과 동일한 폴더에 설치되고, 바탕화면에 실행아이콘을 만들고 싶습니다.



언젠가는 c#으로 멋진 앱을 만들어 봐야지 하는 열정만 가득한 초보입니다.
업무가 공학설계쪽이라, 엑셀에서 많은 작업을 합니다. 이 때 공학 계산에 필요한 복잡한 (엑셀수식으로는 처리가 안되는) 수식은 엑셀 추가기능으로 만들어서 사용하고 있습니다.

ExcelDNA라는 c#(or VB)으로 코드를 짜면, 엑셀에서 vba매크로 함수처럼, 사용자함수-UDF를 만들어서 사용하게 해주는 라이브러리가 있어서 몇 년 전에 만들어 본 적이 있습니다.

현재 아래 그림과 같이 구성되어 있습니다.




3년 전 즈음 만들어서 간단히 배포용 블로그도 만들기도 했습니다. 그런데 C#으로 공학용 코드를 만드는 것이 너무 오랜 시간이 걸리기도 하고, 제 C# 능력이 부족하기도 해서 더 나아지기가 쉽지 않았습니다. 코로나 시절 집에 있는 시간이 많으니 취미삼아 만들기에는 좋았는데, 이제는 그렇지 못한 상황입니다. 최근 2년정도 파이썬을 건드려보게 되었는데, 작업속도가 훨씬 빠르고 이미 검증되어 사용하던 공학 라이브러리들도 많아서 편했습니다. 그래서 최근에는 간단한 툴은 파이썬으로 구현하기도 했습니다.


그런데
아직까지 **풀지 못한 장벽**이 하나 있어서 다시 c#을 들춰볼까 하고 있습니다.
그것은 처음 C#으로 만든 기능의 핵심은 "excel"에서 사용자들이 편하게 사용하는 것입니다.
엑셀사용자함수(UDF)는 주로 엑셀macro파일로 xlam 확장자나 xlsm 등으로 배포합니다. 그런데 이 것은사용자 환경 측면에서는 좋지 못합니다. 배포나 설치, 경로 문제 발생하고 합니다. 그리고 이러한 문제를 제외하더라도 제가 구현하고자 하는 공학용 라이브러리도 파이썬,C# 등과 비교하면 구하기가 어렵습니다. 라이브러리만 구하면 되는 것이 아니라, 공학단위의 변환 등도 확인해야 하고, 디버깅하는 것도 vbe는 구닥다리라 vscode, visual studio와 비교하면 정말 답답한 수준입니다.

엑셀 추가기능을 확장하는 방법 중에서, XLL확장자를 가진, C++나 C#으로 구현된 추가기능을 배포하는 것이 제가 처음 만들었던 C# (ExcelDna) 앱입니다. 그런데 파이썬은 엑셀 추가기능을 직접적으로 만드는 것이 안됩니다.

C#을 잘 써보고 싶은 욕구에 (20년전 대학교 때 살짝 배운 C++ 과 그냥… blazor 앱 샘플을 돌려보니 이뻐서…, 그리고 멋지잖아요…) 다음 기능을 추가해보려고 합니다. 5년, 10년 지나서 누군가가 제가 만든 것을 쓰면서 월 2000원이라고 구독해주면 이라고 꿈을 꿔보기도 합니다.




그래서

  1. 기존에 만들어 둔 엑셀XLL 앱을 자동설치하게 하는 배포’기능’을 추가하고,
  2. 여기에 포함되는 DLL을 불러와서 사용하는 공학용 계산기같은 WPF을 추가하고 한번에 설치되게끔 해보고 싶습니다.

이 것이 가능한 방법일까요?




제가 그동안 고민해 본, 시도해 본 사항입니다.

  • WPF라고 정한 이유는 제가 추가할 독립실행 앱이 계산기 수준이라 용량이 2MB 정도 충분합니다. 그리고 exe파일처럼 복사해서 이동하더라도 실행되게끔 하고 싶었습니다. 그런데 여기서 좋아보이고 UI도 깔끔해 보이는 Blazor App, WinUI3, Unoplatform 등의 기본적인 창에 BUTTON 1개만 추가해도 기본적으로 용량이 50MB, 100MB이상이 되기에 그런 큰 용량의 배포 프로그램을 원하지 않습니다.

  • WinUI3 앱은 Run without debugging이나 publish를 해서 실행해 보면 exe/바로가기가 생성되지 않고 윈도우 App 메뉴에서 선택해서만 실행하는 형태로 보였습니다. 간단히 exe실행파일만 복사해서 사용할 수 없는 것처럼 이해했습니다.

  • Excel Add-in /사용자 함수는 Javascript로도 구현이 가능합니다. (요즘에 MS가 VBA대신 Javascript API를 밀고 있습니다. _파이썬 넣어줄지 알았는데, 안 넣어줍니다) C# 사용자함수를 만들고 그 이후에 이 사실을 알게 되어서 현재는 Javascript로 된 Add-in을 만들어 보기도 했습니다. 제가 위에서 언급한 WPF처럼 만들고 싶어서, VSCODE를 만들었다고 들은, Electron으로 간단하게 만들어보니 이 것 또한 덩치가 100MB가 넘어가서 포기를 했습니다.

  • Blazor (WASM)으로 JS interop을 만들어서 엑셀추가기능을 구현하고 + 독립앱으로 실행될 Blazor앱을 만들면 어떨까 해서 시도해 봤습니다. Blazor(C#)으로 만든 Excel add-in proj는 현재 debugging이 지원이 안됩니다. 관련 유튜브가 있어서 따라해 봤는데, 거기서 설명해 주시는 MS MVP분도 안되네~ 하시곤 성공을 못하셨습니다.

  • 어느 덧 3년 정도의 시간동안 짬짬이 삽질을 했었는데…
    ‘왜 이렇게 돌아왔는가’ 라고 생각해 보면 Window사용자 뿐만 아니라 Mac사용자도 사용하게끔 하려고 했던 것이 가장 큰 이유였습니다. 제 업이 공학설계다 보니 회사 초년에 공부하느라 외국 커뮤니티에서 자료를 찾아보던 일이 많았었습니다. 도움을 많이 받았었는데 15년 정도 지나니 제가 받은 도움을 돌려줄 시기가 오기도 합니다. 그런데 외국 대학생/초년생들은 MACos 사용자가 생각보다 많고 최근에는 web App이 활성화 되다보니 Window를 벗어나 구글스프레드시트나 Office365 Web엑셀에서의 활용도도 고려하면 좋을 것 같다는 생각을 하게 되어 이리저리 찾고 삽질이 길어진 듯 합니다.

  • 어쨋거나 이런 저런 위와 같은 과정을 겪으면서 일단 뭐라도 결과물을, 끝을 맺는 게 중요할 것 같아서 WPF 앱을 추가해서 배포를 해보자는 것이 제 생각이고 이후 또 몇 년이 지나서 새로운 더 나은 방법이 있다면 그것을 추가로 시도해 보는 것이 현재로써는 최선의 선택이라고 판단을 하고 있습니다.

  • 짧게 설명하고, 시간을 빼앗지 않고 싶은 마음이 크지만, 제 실력이 그러하질 못해서 이렇게 넋두리 처럼 쓰게 되었습니다. - 제 주변에 C#. NET을 사용하는 사람은 한 명도 없습니다.
    그래서 시야?라고 할 만한 것이 없이 저 혼자서 인터넷을 찾고 책을 보고 유튜브를 보는 것이 전부인지라 귀한 경험을 조금이라도 나누어 주시면 감사하겠습니다.



방향성만 알려주시면 또한 천천히 공부해 보겠습니다.
긴 글 읽어주셔서 감사합니다.

4개의 좋아요

혹시 VSTO ( Visual Studio Tool for Office ) 는 검토 해보셨을까요?

ClickOnce로 쉽게 배포/업데이트가 가능합니다.

https://www.csharpstudy.com/office/article/2-간단한-Excel-Add-in

여기 간단한 설명이 있습니다.

2개의 좋아요

좋은 의견 감사합니다.

그런데 제가 알기로는 VSTO는 안되는 것으로 알고 있습니다. VSTO를 사용해 버튼을 클릭하는 Add-in 기능을 넣을 수는 있지만, Custom Function인 UDF_사용자함수는 만들 수 없습니다. 그래서 제가 사용한 ExcelDNA(C#), pyxll(Python) 등의 형태가 생긴 것으로 알고 있습니다.

저 또한 한 때 VSTO를 만들어 본 적이 있는데, 이 때 만들면서 찾아본 것이 위의 자료였습니다. 엑셀 작업을 자주 하다보니 이를 사용하는 프로그래밍 형태로 VBA(VB.net)는 어느 정도 익숙해지면서 관심을 가지게 되었었습니다.

하지만 최근에는 또 바뀌었을 수 있으니 한번 더 읽어보고 확인해 보겠습니다.

1개의 좋아요

말씀하신 대로 엑셀 함수는 VSTO로 배포가 불가능합니다.

해서 저는 엑셀 함수는 ExcelDNA로, Add-in 기능은 VSTO로 이원화해서 개발했습니다.

VSTO로 시도하셨던 경험 이야기가 없으셔서, 혹시나 했는데 시도해보셨군요.

제가 알기로도 현재 상태에서는 해결할 방법이 마땅치 않은 것으로 알고 있습니다.
( 혹시나 발견하게 되시면 알려주시면 감사하겠습니다. )

2개의 좋아요

제 생각에는 XLL 을 배포하는 것과 WPF를 배포하는 것은 별개의 문제로 보입니다.
XLL은 엑셀에 설치하는 것이고, WPF는 시스템에 설치하는 것이기 때문입니다.

그래서, WPF 앱을 만들고 거기에 XLL을 Export하는 기능을 넣으면 해결되지 않을까 합니다.
XLL 은 어짜피 정적인 파일이기 때문에 WPF의 자원(바이너리로 포함됨)으로 함께 배포해도 되고, FTP 서버에 올려두고 WPF앱이 다운로드 받아 적정한 위치에 저장(하고 사용자가 엑셀에 설치)하는 방식으로 하면 되지 않을까요?

엑셀 대신 WPF 앱이 XLL을 엑셀에 설치하도록 만드는 것은, 일반적으로 고려 사항이 많고, 불가능할 수 있습니다.

  1. 시스템이 엑셀 앱 전용 폴더에 WPF 앱이 접근하는 것을 허락하는가?
  2. XLL 설치와 관련해서 수정할 엑셀 파일의 전체 구조를 알고 있는가?

즉 이는 엑셀의 제작자인 마소의 정책 문제로 귀결되기 때문에, 허락하지 않으면 불가능한 일인 것이고, 허락하는 방식이라면 닷넷 문서를 통해 방법을 알려줄 것 같습니다.

그리고, WPF는 윈도우 전용 앱입니다.
맥에서는 실행이 불가능하기에 맥으로 배포할 수 있는 방법도 없습니다. 현재 맥, 윈도우(iOS, 안드로이드 포함)를 모두 지원하는 GUI 앱 개발 플랫폼 중 닷넷에서는 MAUI가 유일한 것 같습니다. MAUI 앱의 구조는 WPF와 거의 유사하기에 큰 이질감은 없을 것입니다.

그런데, 라이브러리가 닷넷으로 만들어졌기 때문에 닷넷 앱이 가장 호환성이 좋겠지만, XLL 파일을 이미 생산했으면, GUI 앱을 굳이 닷넷 도구로 만들지 않아도 됩니다. 물론 앱이 닷넷의 라이브러리를 사용해야 하기에, 닷넷과의 협업체계(Interoperability)가 잘 구축된 개발도구를 선택해야 효율적이겠죠.

마지막으로, GUI를 갖춘 앱은 크기가 커질 수 밖에 없습니다.
그것을 원하지 않는다면 콘솔 UI를 구성해도 되지만, 비 개발자인 사용자들이 불편을 겪겠죠.
개발 효율성 측면에서도 좋다고 말할 수 없구요.

큰 도움은 못드렸지만, 훌륭한 공학용 라이브러리의 탄생을 응원하고 기원합니다.

3개의 좋아요

상세한 답변이 많은 도움이 되었습니다.
지난 주 읽어 보고서는 주말에 테스트 해보려 했는데… 그 사이 코로나에 걸려 일주일이 사라져버렸습니다.

  • 설치라는 관점에서 저는 XLL을 먼저 만든 상태였던 지라
    “+ WPF를 설치한다” 라고만 생각만 했습니다. 그런데 이야기 하신 것처럼 2개를 별도의 설치/결과물로 보고 각자관리해도 문제 없을 것 같고 더 관리가 좋을 것 같습니다. 그리고 그 방법으로는 말씀해 주신 WPF를 활용하는 것이 좋을 것 같습니다. WPF가 XLL보다는 다양한 기능을 가질 수 있으니, 다운받고 설치하고 하는 것에 더 적절할 것 같습니다. 엑셀에 접근하는 권한과 경로 그리고 MS의 정책에 대해서는 어느 정도 이해가 있고 현재 다른 Office addin 관련툴을 공유(배포)하면서 ‘정말 까탈스럽게’ 요구하는 MS 기준을 맞춰야지만 제가 원하는 결과를 얻을 수 있다는 것도 체감하고 있습니다.

  • 제가 이전에 다른 툴로 사용했던 것이 WPF라고 착각하고 있었습니다. 그런데 뜯어보니 WPF가 아니라 WinFORM 이였습니다. 그래서 용량이 2~3MB로 작았나 봅니다. WPF의 빈 창을 띄우는 기본 앱을 만들어 보니 확실히 알게 되었습니다.
    윈도우에서만 사용할 것이면 Winform을 사용하고, 최근 MAUI 관련영상을 짬짬이 보고 있습니다. 시간은 걸리겠지만 다양한 플랫폼에서 사용하게끔 하고 싶은 마음도 커서 급한 건 아니니 언젠가는 만들지 않을까 생각하고 있습니다.

  • 제가 고민하지 못한 부분과 고민했더라도 더 고민해 볼 부분에 대해서 좋은 이야기 들려주셔서 한결 가벼운 마음으로 남은 숙제를 풀어가보도록 하겠습니다. 감사합니다.

3개의 좋아요

“그럴 것이다” 라는 수준 밖에 되지 않는 하찮은 답변이었는데, 도움이 되신다니 기쁩니다.

사실, 무한 복제가 가능한 XLL이나, 해마다 바뀌는 보안 정책을 따라야 하는 번거로움이 있는 앱으로 배포하기 보다는 웹 서비스로 제공하는 것이 어떻겠냐는 것이 실제로 하고 싶은 말이었습니다.

웹 API로 제공해도 엑셀에서 가져올 수 있고,
웹 UI를 만들면 클라이언트의 운영체제를 신경 쓸 필요도, 그리고 각 운영체제 별로 상이한 배포 방식에 대한 이해도 필요 없기 때문이죠.

사실 인기 없는 C#이 목숨을 연명하는 것은 윈폼(의 낮은 진입장벽)과 Asp.Net Core(의 준수한 성능) 때문이라고 생각합니다. 이는, 그 정도로 웹 개발에 대한 지원이 좋다는 의미이기도 합니다.

특히, 웹은 광고나 접근 Key 판매 등, 수익 사업으로 발전하기가 용이한 배포 방식이기도 합니다.
코드나 파일 복제 문제에 관해서도 상대적으로 자유롭고요.

2개의 좋아요