닷넷 빌드 후 AutoCAD에서 DLL을 인식하기 위해 연결(NETLOAD) 해야하는데 번들 방식을 이용하면 자동으로 AutoCAD가 켜질 때 인식된다.
.bundle 폴더를 ApplicationPlugins 아래에 만든다packageContents.xml 과 Contents/Windows/ 구조를 만든다Contents/Windows/에 두고, XML의 ModuleName으로 그 상대경로를 적는다ApplicationPlugins를 스캔 → XML을 읽고 DLL 로드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 이어야 합니다.
현재 DLL 경로:
C:\test\AutoCAD CSharp plug-in7\bin\Debug\<ProjectName.dll>
이 파일을 아래 위치로 복사:
C:\Users\roykimsh\AppData\Roaming\Autodesk\ApplicationPlugins\MyCommand.bundle\Contents\Windows\
다음 내용을 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면 좋지만, 데모에선 위처럼 아무 값이나 써도 동작합니다.매번 수동 복사 대신, 프로젝트의 빌드 후 이벤트에 아래를 추가하세요.
프로젝트 속성 → 빌드 이벤트 → 빌드 후 이벤트 명령줄
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이 번들 폴더로 들어갑니다.
AutoCAD 종료했다가 다시 실행
(시작 시 ApplicationPlugins를 스캔하고 packageContents.xml을 읽습니다.)
자동 로드 설정이면 바로 로드 완료.
명령 호출 로드라면, HELLO 같은 등록한 명령을 실행해 보세요.
문제가 있으면 명령창에 Autoloader 관련 경고가 찍히므로 확인하세요.
또는 APPAUTOLOADER 명령으로 상태를 볼 수 있습니다.
…\ApplicationPlugins\*.bundle 폴더들을 일괄 스캔합니다.packageContents.xml을 파싱해서,ModuleName의 DLL을 반드시 상대경로로 찾아 로드합니다.ModuleName="./Contents/Windows/ProjectName.dll" 대소문자/공백 확인Contents/Windows/에 있어야 함acdbmgd.dll, acmgd.dll, AcCoreMgd.dll은 해당 AutoCAD 설치 폴더에서 참조[CommandMethod("HELLO")]가 실제로 존재하는지 확인시작 시 로드가 아니라, 명령을 쳤을 때만 로드하려면 이렇게 바꿔도 됩니다.
<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이 로드되고, 그다음부터 명령이 실행됩니다.