AutoCAD (netload) DLL 번들 방식으로 자동 연결하기

sunghoon·2025년 10월 27일
0

2.0 Glove Project

목록 보기
39/40

AutoCAD 공식문서

Help

사용이유

닷넷 빌드 후 AutoCAD에서 DLL을 인식하기 위해 연결(NETLOAD) 해야하는데 번들 방식을 이용하면 자동으로 AutoCAD가 켜질 때 인식된다.

개요

  • .bundle 폴더를 ApplicationPlugins 아래에 만든다
  • 폴더 안에 packageContents.xmlContents/Windows/ 구조를 만든다
  • DLL을 Contents/Windows/에 두고, XML의 ModuleName으로 그 상대경로를 적는다
  • AutoCAD가 시작할 때 ApplicationPlugins를 스캔 → XML을 읽고 DLL 로드

1) 폴더 만들기

ApplicationPlugins 경로

C:\Users\roykimsh\AppData\Roaming\Autodesk\ApplicationPlugins

여기에 솔루션 이름과 맞춘 번들 폴더를 하나 만듭니다. 예:

C:\Users\roykimsh\AppData\Roaming\Autodesk\ApplicationPlugins\MyCommand.bundle\

이 폴더 안에 다음 구조를 만듭니다:

MyCommand.bundle\
 ├─ packageContents.xml
 └─ Contents\
     └─ Windows\
         └─ <ProjectName>.dll   ← 여기로 DLL을 복사

주의: 폴더 이름 끝이 반드시 .bundle 이어야 합니다.


2) DLL 배치

현재 DLL 경로:

C:\test\AutoCAD CSharp plug-in7\bin\Debug\<ProjectName.dll>

이 파일을 아래 위치로 복사:

C:\Users\roykimsh\AppData\Roaming\Autodesk\ApplicationPlugins\MyCommand.bundle\Contents\Windows\

3) packageContents.xml 만들기

다음 내용을 packageContents.xml로 저장합니다. (Name/Version을 DLL명으로 맞춰야한다.)

<?xml version="1.0" encoding="utf-8"?>
<ApplicationPackage
  SchemaVersion="1.0"
  Name="AcadPlugIn"
  AppVersion="1.0.0"
  Description="AutoCAD .NET plugin sample loaded via Autoloader (.bundle)."
  Author="Seonghoon Kim"
  ProductCode="{7F9C5C1A-AAAA-4E0B-9D00-ACSP7-00000001}"
  UpgradeCode="{7F9C5C1A-BBBB-4E0B-9D00-ACSP7-00000001}"
  AllUsers="false"
  SupportedLocales="en-us;ko-kr">

  <Components>

    <RuntimeRequirements
      OS="Win64"
      Platform="AutoCAD*"
      />

    <ComponentEntry
      AppName="AcadPlugIn"
      Version="1.0.0"
      ModuleName="./Contents/Windows/AcadPlugIn.dll"
      AppDescription="Sample commands"
      LoadOnAutoCADStartup="True">

      <!-- 지연 로드가 필요하면 위를 False로 바꾸고 아래 Commands에 실제 명령을 등록 -->
      <!--
      <Commands GroupName="AcadPlugIn">
        <Command Global="HELLO" Local="HELLO"/>
      </Commands>
      -->

    </ComponentEntry>

  </Components>
</ApplicationPackage>

포인트:

  • ModuleName반드시 번들 폴더 기준 상대경로로 적습니다. (위처럼 ./Contents/Windows/…dll)
  • 시작하자마자 자동 로드하려면 LoadOnAutoCADStartup="True" 특정 명령을 쳤을 때만 로드하려면 False로 바꾸고 <Commands>에 실제 명령 이름을 등록하세요.
  • ProductCode/UpgradeCode는 고유 GUID면 좋지만, 데모에선 위처럼 아무 값이나 써도 동작합니다.

4) Visual Studio에서 “빌드 후 자동 복사” 추가 (선택이지만 강력 추천)

매번 수동 복사 대신, 프로젝트의 빌드 후 이벤트에 아래를 추가하세요.

프로젝트 속성 → 빌드 이벤트 → 빌드 후 이벤트 명령줄

REM 번들 폴더 경로 (필요 시 공백 포함 경로를 모두 쌍따옴표로 감쌉니다)
set BUNDLE_DIR=%AppData%\Autodesk\ApplicationPlugins\MyCommand.bundle

if not exist "%BUNDLE_DIR%\Contents\Windows" mkdir "%BUNDLE_DIR%\Contents\Windows"

REM DLL 복사
copy /Y "$(TargetPath)" "%BUNDLE_DIR%\Contents\Windows\"

REM (선택) PDB도 복사하면 디버깅 편함
if exist "$(TargetDir)$(TargetName).pdb" copy /Y "$(TargetDir)$(TargetName).pdb" "%BUNDLE_DIR%\Contents\Windows\"

이렇게 하면 Debug 빌드 시 자동으로 최신 DLL이 번들 폴더로 들어갑니다.


5) AutoCAD에서 확인

  1. AutoCAD 종료했다가 다시 실행

    (시작 시 ApplicationPlugins를 스캔하고 packageContents.xml을 읽습니다.)

  2. 자동 로드 설정이면 바로 로드 완료.

    명령 호출 로드라면, HELLO 같은 등록한 명령을 실행해 보세요.

  3. 문제가 있으면 명령창에 Autoloader 관련 경고가 찍히므로 확인하세요.

    또는 APPAUTOLOADER 명령으로 상태를 볼 수 있습니다.


6) “.bundle이 어떻게 DLL을 가져가나?” 동작 원리

  • AutoCAD는 시작할 때 …\ApplicationPlugins\*.bundle 폴더들을 일괄 스캔합니다.
  • 각 번들 안의 packageContents.xml을 파싱해서,
    • 이 패키지가 어떤 AutoCAD에서 유효한지(Platform, OS, Series 등)
    • 어떤 DLL을 언제 로드해야 하는지(Startup/명령 호출/문서 이벤트 등) 를 판단합니다.
  • 그 규칙에 따라 ModuleName의 DLL을 반드시 상대경로로 찾아 로드합니다.
  • 그래서 솔루션(프로젝트) 위치와는 무관하고, 번들 폴더 구조와 XML만 맞으면 됩니다.

7) 흔한 오류 체크리스트

  • 경로 오타: ModuleName="./Contents/Windows/ProjectName.dll" 대소문자/공백 확인
  • DLL 위치: DLL이 꼭 번들 내부 Contents/Windows/에 있어야 함
  • .NET 타깃 프레임워크: AutoCAD 2024는 .NET Framework 4.8 기반. 프로젝트 Target Framework를 4.8로
  • 참조 DLL 버전: acdbmgd.dll, acmgd.dll, AcCoreMgd.dll해당 AutoCAD 설치 폴더에서 참조
  • 명령 이름: 코드에 [CommandMethod("HELLO")]가 실제로 존재하는지 확인
  • 권한 문제: 번들 폴더에 쓰기 권한 있는지
  • 캐시 이슈: 드물게 캐시 문제 시 AutoCAD 완전 종료 후 재시작

8) 보너스: 명령 지연 로드 예시 XML

시작 시 로드가 아니라, 명령을 쳤을 때만 로드하려면 이렇게 바꿔도 됩니다.

<ComponentEntryAppName="AutoCAD CSharp plug-in7"
  Version="1.0.0"
  ModuleName="./Contents/Windows/ProjectName.dll"
  AppDescription="Sample commands"
  LoadOnAutoCADStartup="False">
  <Commands GroupName="AutoCADCSharpPlugIn7">
    <Command Global="HELLO" Local="HELLO"/>
  </Commands>
</ComponentEntry>

→ AutoCAD 실행 후 HELLO를 처음 입력하는 순간 DLL이 로드되고, 그다음부터 명령이 실행됩니다.

profile
프라다 신은 빈지노와 쿠페를 타는 꿈을 꿨다.

0개의 댓글