본문 바로가기
C#

error. 이벤트핸들러 이름 충돌

by 공부봇 2025. 9. 22.
반응형

문제 원인은 이름 충돌이에요.

  • 당신이 만든 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; 처럼 별칭을 써서 혼동을 줄이세요.
  • 여러 파일에서 두 타입을 동시에 써야 한다면 항상 별칭/정규 네임스페이스 표기를 유지하는 게 안전합니다.

필요하면 제가 충돌나는 다른 파일까지 한 번에 정리(리네임/별칭 적용)해 드릴게요.

반응형