반응형
문제 원인은 이름 충돌이에요.
- 당신이 만든 VIK.ImageGrabbedEventArgs (버퍼+카메라)와
- Basler SDK의 Basler.Pylon.ImageGrabbedEventArgs (GrabResult 포함)
이 같은 이름이라, StreamGrabber.ImageGrabbed 구독 시 컴파일러가 잘못된 쪽을 참고하고 있어요. 그래서
- “EventHandler<ImageGrabbedEventArgs>에 맞는 오버로드 없음”
- “DisposeGrabResultIfClone, GrabResult가 없음”
같은 에러가 터집니다. (이 멤버들은 Basler 쪽에만 있어요.)
빠른 해결: 형식 별칭 + 핸들러 이름 구분
Basler 파일에서 형식 별칭을 추가하고, 이벤트 핸들러를 Basler 전용으로 분리하세요.
1) using 별칭 추가 (파일 상단)
using Basler.Pylon;
using PylonImageGrabbedEventArgs = Basler.Pylon.ImageGrabbedEventArgs; // ★ 추가
2) 구독/해제 메서드에서 핸들러 변경
// 구독
m_Camera.StreamGrabber.ImageGrabbed += OnPylonImageGrabbed;
// 해제
m_Camera.StreamGrabber.ImageGrabbed -= OnPylonImageGrabbed;
3) 핸들러 시그니처/본문 수정
// Basler SDK 전용 핸들러 (이름을 달리해 혼동 방지)
private void OnPylonImageGrabbed(object sender, PylonImageGrabbedEventArgs e)
{
try
{
if (OnImageGrabbedCallback != null && IsGrabbing())
{
IGrabResult grabResult = e.GrabResult;
if (grabResult.GrabSucceeded)
{
int nWidth = grabResult.Width;
int nHeight = grabResult.Height;
bool isColor = IsColor();
m_Converter.OutputPixelFormat = isColor ? PixelType.BGR8packed : PixelType.Mono8;
int bytesPerPixel = isColor ? 3 : 1;
int stride = nWidth * bytesPerPixel;
int size = stride * nHeight;
lock (m_ImageLock)
{
EnsureBuffer(size);
m_Converter.Convert(m_FrameHandle.AddrOfPinnedObject(), size, grabResult);
OnImageGrabbedCallback(
m_FrameHandle.AddrOfPinnedObject(),
nWidth, nHeight, stride,
isColor,
m_nCameraNo);
}
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"Basler.cs - OnPylonImageGrabbed: {ex.Message}");
}
finally
{
// Basler 이벤트 인자 전용 메서드 — 별칭 적용으로 이 메서드가 보이게 됩니다.
e.DisposeGrabResultIfClone();
}
}
이렇게 하면 이 파일에서 ImageGrabbedEventArgs가 항상 Basler 쪽 타입으로 해석되므로, GrabResult, DisposeGrabResultIfClone()를 정상적으로 사용할 수 있어요.
장기적인 권장(선택)
- 당신의 커스텀 이벤트 인자 VIK.ImageGrabbedEventArgs의 이름을
- SimulationImageGrabbedEventArgs 같이 의미 있게 변경하거나,
- 해당 파일들에서 using VIKImageGrabbedEventArgs = VIK.ImageGrabbedEventArgs; 처럼 별칭을 써서 혼동을 줄이세요.
- 여러 파일에서 두 타입을 동시에 써야 한다면 항상 별칭/정규 네임스페이스 표기를 유지하는 게 안전합니다.
필요하면 제가 충돌나는 다른 파일까지 한 번에 정리(리네임/별칭 적용)해 드릴게요.
반응형
'C#' 카테고리의 다른 글
“C# readonly: 생성 후 불변을 보장해 버그를 줄이고 성능을 챙기는 설계 키워드” (0) | 2025.10.10 |
---|---|
“IDisposable: 가비지 컬렉터가 다 못하는 ‘자원 반납’을 결정적으로 보장하는 계약” (0) | 2025.10.10 |
C# “??는 ‘null이면 우변’ — 안전한 기본값 지정의 한 줄 공식” (0) | 2025.10.10 |
“C# 값 형식에도 없음(null)을 — T? = Nullable<T> 제대로 쓰는 법” (0) | 2025.10.10 |
volatile는 멀티스레드에서 “가벼운 동기화”를 위한 읽기/쓰기 가시성 보장 장치 (0) | 2025.09.19 |
왜 IDisposable을 구현하나요? (0) | 2025.09.19 |
“직접 델리게이트 콜백” → “.NET 표준 이벤트 패턴(Event + EventArgs)” (0) | 2025.09.19 |
sealed를 왜 써야 할까? (0) | 2025.09.19 |