외부 DLL 노드 정확도 개선 (엔진/프레임워크 노이즈 제거)

- 외부 DLL 은 '실제 존재 + 저장소(scanBase) 내부' 인 경우만 노드화
  → $(OdaBinDir) 등 매크로 HintPath(TD_Mgd_$(ODAVER))·프레임워크/GAC DLL 제외
- 이름이 내부 프로젝트와 일치(버전 모호 포함)하면 외부 DLL 로 취급하지 않음
  → Pet.Data_22.12_16 오분류 방지

검증: ZOO(제품뷰 config)=68노드 엔진 미포함, BoxZainer=188노드 유지(phantom 0)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-08 12:39:59 +09:00
co-authored by Claude Opus 4.8
parent d10470e1fd
commit becc995c22
2 changed files with 6 additions and 3 deletions
BIN
View File
Binary file not shown.
+6 -3
View File
@@ -259,12 +259,15 @@ public static class DsmEngine
foreach (Match m in reRefBlock.Matches(txt)) foreach (Match m in reRefBlock.Matches(txt))
{ {
var inc = m.Groups[1].Value.Split(',')[0].Trim(); var inc = m.Groups[1].Value.Split(',')[0].Trim();
bool internalMatch = byExact.ContainsKey(inc) || (byNorm.TryGetValue(Norm(inc), out var nm2) && nm2.Count == 1); // 내부 프로젝트명과 일치(버전 모호 포함)하면 외부 DLL 로 보지 않음
if (internalMatch) continue; if (byExact.ContainsKey(inc) || byNorm.ContainsKey(Norm(inc))) continue;
var hint = reHint.Match(m.Groups[2].Value); var hint = reHint.Match(m.Groups[2].Value);
if (!hint.Success) continue; if (!hint.Success) continue;
string hp; try { hp = Path.GetFullPath(Path.Combine(dir, hint.Groups[1].Value.Replace('\\', '/'))); } catch { 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); var en = RegisterExtDll(inc);
if (en != src) edges[src].Add(en); if (en != src) edges[src].Add(en);
} }