macOS에서 Claude Code C# LSP 완벽 세팅 가이드 — csharp-ls 설치부터 트러블슈팅까지
- 실전 데이터로 보는 게임 개발자의 AI 활용법 - 2,165 메시지의 기록
- Claude Opus 4.5 → 4.6 전환기 - 게임 개발자가 체감한 성능, 토큰, 워크플로우의 변화
- AGENTS.md는 정말 도움이 될까? - 코딩 에이전트의 컨텍스트 파일 효과를 검증한 논문 분석
- Claude 메모리 무료 개방과 /simplify, /batch — 그리고 CLAUDE.md의 숨겨진 비용
- Windows에서 Claude Code 설치 완전 가이드 — 실전 트러블슈팅 포함
- 게임 기획자를 위한 Claude Code 완전 활용 가이드 — 사양서부터 밸런싱까지
- macOS에서 Claude Code C# LSP 완벽 세팅 가이드 — csharp-ls 설치부터 트러블슈팅까지
- C# LSP vs JetBrains MCP — 토큰 효율성 분석 리포트
- Claude Code에서 C# LSP를 사용하려면 .NET SDK + csharp-ls + 환경변수 2줄 + 플러그인 활성화, 이 4가지만 갖추면 된다
- 설치 실패의 90%는 DOTNET_ROOT 환경변수 미설정이 원인이다 — Apple Silicon과 Intel Mac의 경로가 다르다
- 프로젝트 루트에 .sln 파일이 없으면 csharp-ls가 심볼을 인덱싱하지 못한다
들어가며
Claude Code는 다양한 언어의 LSP(Language Server Protocol)를 지원하여 코드 분석, 심볼 탐색, 리팩토링 등을 수행할 수 있다. 그중 C# LSP는 Unity, .NET 프로젝트에서 코드 품질을 높이는 데 핵심적인 도구다.
하지만 macOS에서 C# LSP를 설정하는 과정은 Windows보다 까다롭다. .NET SDK 경로, 환경변수, 플러그인 활성화 등 여러 단계에서 막힐 수 있는 포인트가 존재한다.
이 글은 macOS에서 Claude Code의 C# LSP(csharp-ls)를 설치하며 실제로 겪은 문제들과 해결 방법을 정리한 실전 가이드다. Quick Start로 빠르게 설치하거나, 문제가 생기면 수동 설정 가이드를 참고하면 된다.
1. 검증된 환경
| 항목 | 값 |
|---|---|
| macOS | Sequoia 26.1 |
| Architecture | arm64 (Apple Silicon) |
| Rosetta | 설치됨 |
| .NET SDK | 10.0.101 (Homebrew) |
| csharp-ls | 0.22.0 |
| Claude Code | 최신 버전 |
2. Quick Start (6단계)
이미 Homebrew가 설치되어 있다면, 아래 6단계로 바로 설치할 수 있다. 문제가 발생하면 수동 설정 가이드를 참고하자.
사전 확인
터미널을 열고 현재 상태를 확인한다:
1
2
3
dotnet --version # 버전 나오면 → Step 1 건너뛰기
csharp-ls --version # 버전 나오면 → Step 2 건너뛰기
echo $DOTNET_ROOT # 경로 나오면 → Step 3 건너뛰기
Step 1. .NET SDK 설치
1
brew install dotnet
설치 후 확인:
1
2
dotnet --version
# 출력: 10.0.101
Step 2. csharp-ls 설치
1
dotnet tool install --global csharp-ls
설치 후 확인:
1
2
csharp-ls --version
# 출력: 0.22.0
csharp-ls: command not found가 뜨면 Step 3의 PATH 설정을 먼저 진행하자.
Step 3. 환경변수 설정 (.zshrc)
이 단계가 가장 중요하다. ~/.zshrc 파일에 아래 2줄을 추가한다:
1
2
3
# Apple Silicon Mac (M1/M2/M3/M4)
export DOTNET_ROOT="/opt/homebrew/opt/dotnet/libexec"
export PATH="$PATH:$HOME/.dotnet/tools"
셸 다시 로드:
1
source ~/.zshrc
Intel Mac인 경우 DOTNET_ROOT 경로가 다르다:
1 export DOTNET_ROOT="/usr/local/share/dotnet"
Step 4. Claude Code 플러그인 활성화
~/.claude/settings.json에 추가:
1
2
3
4
5
{
"enabledPlugins": {
"csharp-lsp@claude-plugins-official": true
}
}
프로젝트별로도 활성화하려면 <프로젝트>/.claude/settings.json에도 동일하게 추가한다.
Step 5. 프로젝트에 .sln 파일 확인
csharp-ls는 .sln → .csproj 경로를 통해 심볼을 인덱싱한다. 프로젝트 루트에 .sln 파일이 반드시 있어야 한다.
1
2
ls *.sln
# 출력 예: MyProject.sln
.sln 파일이 없다면 생성:
1
2
dotnet new sln -n MyProject
dotnet sln add path/to/MyProject.csproj
Step 6. 설치 확인
모든 설정이 끝났다면 아래 명령어로 최종 확인한다:
1
2
3
4
5
# 모두 정상 출력되면 성공
dotnet --version # .NET SDK 버전
which csharp-ls # ~/.dotnet/tools/csharp-ls
csharp-ls --version # 0.22.0
echo $DOTNET_ROOT # /opt/homebrew/opt/dotnet/libexec
Claude Code를 실행하고 C# 프로젝트 디렉토리에서 LSP 기능이 작동하는지 확인하면 된다.
3. 아키텍처 이해
Quick Start만으로 충분하지만, 문제가 발생했을 때 원인을 파악하려면 전체 구조를 이해하는 것이 좋다.
구성 요소 관계도
1
2
3
4
5
6
7
8
9
10
11
Claude Code
│
├── csharp-lsp 플러그인 (settings.json에서 활성화)
│ │
│ └── csharp-ls (LSP 서버)
│ │
│ ├── DOTNET_ROOT → .NET SDK 위치 참조
│ │
│ └── .sln 파일 → .csproj → 심볼 인덱싱
│
└── PATH → ~/.dotnet/tools (csharp-ls 바이너리 위치)
각 구성 요소의 역할
| 구성 요소 | 역할 | 설치 경로 |
|---|---|---|
| .NET SDK | C# 컴파일러 및 런타임 | /opt/homebrew/Cellar/dotnet/10.0.101/ |
| csharp-ls | LSP 서버 (심볼 탐색, 자동완성 등) | ~/.dotnet/tools/csharp-ls |
| DOTNET_ROOT | csharp-ls가 SDK를 찾는 환경변수 | /opt/homebrew/opt/dotnet/libexec |
| .sln 파일 | 프로젝트 구조 정의 (인덱싱 진입점) | 프로젝트 루트 |
| 플러그인 | Claude Code와 csharp-ls를 연결 | ~/.claude/plugins/ |
플러그인 파일 구조
플러그인 활성화 시 자동 생성되는 파일들:
1
2
3
4
5
~/.claude/plugins/
├── cache/claude-plugins-official/csharp-lsp/1.0.0/README.md
└── marketplaces/claude-plugins-official/plugins/csharp-lsp/
├── LICENSE
└── README.md
4. 수동 설정 가이드
Quick Start에서 문제가 발생했을 때 참고하는 단계별 상세 가이드다.
4-1. .NET SDK 수동 설치 및 검증
Homebrew로 설치가 안 되는 경우, Microsoft 공식 설치 스크립트를 사용한다:
1
2
# 공식 설치 스크립트
curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel LTS
이 경우 설치 경로가 ~/.dotnet이 되므로 환경변수를 맞춰야 한다:
1
2
export DOTNET_ROOT="$HOME/.dotnet"
export PATH="$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools"
설치 확인:
1
dotnet --info
dotnet --info 출력에서 아래 항목을 확인한다:
- Base Path — SDK가 실제로 설치된 경로
- Runtime Environment: OS — 아키텍처가
arm64(Apple Silicon) 또는x64(Intel)인지 확인
4-2. csharp-ls 수동 설치 및 검증
기본 설치 실패 시:
1
2
3
4
5
6
# 캐시 정리 후 재설치
dotnet nuget locals all --clear
dotnet tool install --global csharp-ls
# 특정 버전 지정 설치
dotnet tool install --global csharp-ls --version 0.22.0
이미 설치된 경우 업데이트:
1
dotnet tool update --global csharp-ls
바이너리 직접 확인:
1
2
3
4
5
6
# 파일 존재 여부
ls -la ~/.dotnet/tools/csharp-ls
# 아키텍처 확인 (arm64여야 함)
file ~/.dotnet/tools/csharp-ls
# 출력 예: Mach-O 64-bit executable arm64
4-3. 환경변수 디버깅
환경변수 문제가 의심될 때 하나씩 확인하는 방법:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. DOTNET_ROOT 확인
echo $DOTNET_ROOT
# 빈 문자열이면 → 미설정 (가장 흔한 실패 원인)
# 2. DOTNET_ROOT 경로에 실제 SDK가 있는지 확인
ls $DOTNET_ROOT/sdk/
# 10.0.101 같은 디렉토리가 있어야 함
# 3. csharp-ls 바이너리가 PATH에 있는지 확인
which csharp-ls
# 출력 없으면 → ~/.dotnet/tools가 PATH에 없음
# 4. PATH에 ~/.dotnet/tools가 포함되어 있는지 확인
echo $PATH | tr ':' '\n' | grep dotnet
4-4. .sln 파일 생성 (Unity 프로젝트)
Unity 프로젝트의 경우 .sln 파일이 Unity Editor에서 자동 생성된다:
- Unity Editor를 연다
- Edit → Preferences → External Tools로 이동
- External Script Editor를 설정 (Visual Studio Code 등)
- Regenerate project files 클릭
수동으로 생성하는 경우:
1
2
3
4
5
cd /path/to/unity-project
dotnet new sln -n MyUnityProject
# Assembly-CSharp.csproj 등을 추가
dotnet sln add Assembly-CSharp.csproj
4-5. 플러그인 수동 활성화 확인
플러그인이 제대로 활성화되었는지 확인하는 방법:
1
2
3
4
5
6
7
8
# 글로벌 설정 확인
cat ~/.claude/settings.json | grep -A2 "enabledPlugins"
# 프로젝트별 설정 확인
cat .claude/settings.json | grep -A2 "enabledPlugins"
# 플러그인 파일이 다운로드되었는지 확인
ls ~/.claude/plugins/cache/claude-plugins-official/csharp-lsp/
5. 트러블슈팅
Case 1: csharp-ls: command not found
원인: ~/.dotnet/tools가 PATH에 없음
해결:
1
2
3
4
5
6
7
8
9
# 1. 바이너리 존재 확인
ls ~/.dotnet/tools/csharp-ls
# 2. PATH에 추가 (~/.zshrc)
export PATH="$PATH:$HOME/.dotnet/tools"
source ~/.zshrc
# 3. 확인
which csharp-ls
Case 2: csharp-ls 실행 시 SDK를 찾지 못함
원인: DOTNET_ROOT 환경변수 미설정 (가장 흔한 원인)
해결:
1
2
3
4
5
6
7
8
# Apple Silicon Mac
export DOTNET_ROOT="/opt/homebrew/opt/dotnet/libexec"
# Intel Mac
export DOTNET_ROOT="/usr/local/share/dotnet"
# 확인 — SDK 디렉토리가 보여야 함
ls $DOTNET_ROOT/sdk/
Case 3: OmniSharp와 충돌
증상: csharp-ls가 설치되어 있지만 LSP가 비정상 작동
원인: OmniSharp가 함께 설치되어 있으면 충돌 가능
해결:
1
2
3
4
5
# OmniSharp 설치 여부 확인
dotnet tool list -g | grep omnisharp
# 설치되어 있다면 제거
dotnet tool uninstall -g omnisharp
Mono(
/opt/homebrew/bin/mono)는 csharp-ls와 충돌하지 않는다. Mono가 설치되어 있어도 문제없다.
Case 4: .sln 파일이 있는데 심볼 인덱싱이 안 됨
원인: .sln 파일에 .csproj가 등록되지 않았거나, .csproj 경로가 잘못됨
해결:
1
2
3
4
5
# .sln에 등록된 프로젝트 확인
cat MyProject.sln | grep "\.csproj"
# 빈 결과면 → .csproj 등록 필요
dotnet sln add path/to/MyProject.csproj
Case 5: Claude Code에서 LSP 기능이 작동하지 않음
진단 순서:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1단계: csharp-ls 자체가 작동하는지 확인
csharp-ls --version
# 2단계: DOTNET_ROOT 확인
echo $DOTNET_ROOT
# 3단계: 플러그인 활성화 확인
cat ~/.claude/settings.json
# 4단계: .sln 파일 존재 확인
ls *.sln
# 5단계: Claude Code 재시작
# 플러그인 설정 변경 후에는 반드시 Claude Code를 재시작해야 한다
Case 6: Homebrew dotnet과 공식 설치 스크립트 dotnet 충돌
증상: dotnet이 실행되지만 csharp-ls가 SDK를 못 찾음
원인: Homebrew와 공식 스크립트가 다른 경로에 SDK를 설치하여 DOTNET_ROOT가 잘못된 SDK를 가리킴
해결:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 어떤 dotnet이 실행되고 있는지 확인
which dotnet
dotnet --info
# Homebrew 버전이면
export DOTNET_ROOT="/opt/homebrew/opt/dotnet/libexec"
# 공식 스크립트 버전이면
export DOTNET_ROOT="$HOME/.dotnet"
# 하나만 남기는 것을 권장
# Homebrew 버전 제거
brew uninstall dotnet
# 또는 공식 스크립트 버전 제거
rm -rf ~/.dotnet
6. 회사 컴퓨터(다른 Mac) 세팅 체크리스트
새 Mac에서 처음부터 세팅할 때 사용하는 체크리스트다. 복사해서 그대로 따라하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# ✅ Step 1: .NET SDK 설치
brew install dotnet
# ✅ Step 2: 환경변수 설정 (~/.zshrc에 추가)
echo '' >> ~/.zshrc
echo '# .NET & csharp-ls 설정' >> ~/.zshrc
echo 'export DOTNET_ROOT="/opt/homebrew/opt/dotnet/libexec"' >> ~/.zshrc
echo 'export PATH="$PATH:$HOME/.dotnet/tools"' >> ~/.zshrc
# ✅ Step 3: 셸 다시 로드
source ~/.zshrc
# ✅ Step 4: csharp-ls 설치
dotnet tool install --global csharp-ls
# ✅ Step 5: 설치 확인
which csharp-ls # ~/.dotnet/tools/csharp-ls
csharp-ls --version # 0.22.0
# ✅ Step 6: Claude Code 플러그인 활성화
# ~/.claude/settings.json에 아래 내용 추가:
# {
# "enabledPlugins": {
# "csharp-lsp@claude-plugins-official": true
# }
# }
# ✅ Step 7: 프로젝트 루트에 .sln 파일 확인
ls *.sln
Intel Mac인 경우 Step 2의 DOTNET_ROOT를 아래로 변경:
1 export DOTNET_ROOT="/usr/local/share/dotnet"
7. 자주 묻는 질문
Q. OmniSharp도 설치해야 하나?
아니다. csharp-ls만 있으면 된다. OmniSharp는 설치하지 않는 것이 오히려 깔끔하다. 두 LSP 서버가 공존하면 충돌 가능성이 있다.
Q. Mono가 설치되어 있는데 괜찮은가?
괜찮다. Mono(/opt/homebrew/bin/mono)는 csharp-ls와 독립적으로 동작하며 충돌하지 않는다.
Q. Apple Silicon Mac에서 Rosetta가 필요한가?
필수는 아니다. csharp-ls는 arm64 네이티브 바이너리로 설치된다. 다만 일부 .NET 도구가 x64만 지원하는 경우가 있어 Rosetta가 설치되어 있으면 호환성이 좋다.
Q. 프로젝트마다 플러그인 설정을 해야 하나?
~/.claude/settings.json에 글로벌로 설정하면 모든 프로젝트에 적용된다. 특정 프로젝트에서만 사용하고 싶다면 <프로젝트>/.claude/settings.json에만 설정하면 된다.
Q. csharp-ls 업데이트는 어떻게 하나?
1
dotnet tool update --global csharp-ls
마치며
C# LSP 설정의 핵심은 환경변수 2줄이다:
1
2
export DOTNET_ROOT="/opt/homebrew/opt/dotnet/libexec" # SDK 경로
export PATH="$PATH:$HOME/.dotnet/tools" # 바이너리 경로
이 2줄이 .zshrc에 있고, csharp-ls가 설치되어 있으며, 플러그인이 활성화되어 있다면 Claude Code에서 C# 코드를 완벽하게 분석할 수 있다.
문제가 발생하면 트러블슈팅 섹션의 진단 순서를 따라가면 대부분 해결된다. 가장 흔한 원인은 DOTNET_ROOT 미설정이라는 것만 기억하자.
