diff --git a/exe/DsmTool.exe b/exe/DsmTool.exe index 8e1269c..7ee09e9 100644 Binary files a/exe/DsmTool.exe and b/exe/DsmTool.exe differ diff --git a/src/DsmTool/DsmEngine.cs b/src/DsmTool/DsmEngine.cs index 4659823..72453d3 100644 --- a/src/DsmTool/DsmEngine.cs +++ b/src/DsmTool/DsmEngine.cs @@ -259,12 +259,15 @@ public static class DsmEngine foreach (Match m in reRefBlock.Matches(txt)) { var inc = m.Groups[1].Value.Split(',')[0].Trim(); - bool internalMatch = byExact.ContainsKey(inc) || (byNorm.TryGetValue(Norm(inc), out var nm2) && nm2.Count == 1); - if (internalMatch) continue; + // 내부 프로젝트명과 일치(버전 모호 포함)하면 외부 DLL 로 보지 않음 + if (byExact.ContainsKey(inc) || byNorm.ContainsKey(Norm(inc))) continue; var hint = reHint.Match(m.Groups[2].Value); if (!hint.Success) continue; string hp; try { hp = Path.GetFullPath(Path.Combine(dir, hint.Groups[1].Value.Replace('\\', '/'))); } catch { continue; } - if (Excluded(hp) || !hp.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) continue; + // 실제 존재 + 저장소(scanBase) 내부의 DLL 만 노드화 + // → 매크로 경로($(OdaBinDir) 등)·프레임워크/GAC DLL 은 제외 + if (!hp.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) continue; + if (Excluded(hp) || !File.Exists(hp) || !hp.StartsWith(scanBase, StringComparison.OrdinalIgnoreCase)) continue; var en = RegisterExtDll(inc); if (en != src) edges[src].Add(en); }