2009-10-28 3 views
0

vb6 클라이언트가있는 C#에서 COM 서버를 구현했습니다.C# - COM 서버 작성 - 클라이언트에서 발생하지 않는 이벤트

이벤트를 발생 시키면 핸들러는 항상 null입니다. vb6 앱이 내 이벤트를 구독하지 않는 것처럼 보입니다.

vb6 응용 프로그램은 기존 타사 응용 프로그램이며 오류 메시지를 표시하지 않는 것으로 보입니다.

일반적인 방법은 COM 클라이언트 -> 서버에서 정상적으로 작동합니다.

무슨 일이 일어나고 있는지 디버깅하기 위해 할 수있는 일이 있습니까? 또는 왜 내 행사가 효과가 없습니까?

여기 내 코드의 간단한 예를 조각입니다 : 내가 대체하기 위해 노력하고있어 기존의 OCX 파일을하려고하면

[ComVisible(true), 
     Guid(Constants.CLASS_IID), 
     ProgId(Constants.PROG_ID), 
     ClassInterface(ClassInterfaceType.None), 
     ComSourceInterfaces(typeof(IMyServiceEvents))] 
    public class MyClass : Control, IMyService, IMyServiceEvents 
    { 
     [DispId(1)] 
     public event MyEventHandler MyEvent; 

     //... also implements IMyService, which is working 
    } 

    [ComVisible(true), 
     InterfaceType(ComInterfaceType.InterfaceIsIDispatch), 
     Guid(Constants.EVENTS_IID)] 
    public interface IMyServiceEvents 
    { 
     [PreserveSig, DispId(1)] 
     void MyEvent([In]int Status); 
    } 

    [ComVisible(false)] 
    public delegate void MyEventHandler(int Status); 

은/내 C#의 COM 서버 구현, 이벤트는 정상적으로 작동합니다. vb6로도 작성되었으므로 C# 서버의 내용이 잘못되었습니다.

또한 ClassInterfaceType에 대한 3 가지 설정을 모두 시도해보고 동일한 결과를 얻었습니다. 각 COM 서버를 다시 등록해야했지만.

내 생성 IDL을 보면 내게 맞았으며 모든 것이 원래 IDL과 매우 유사하게 보이기 때문에 재 작성하려고하는데 필요한 경우 게시 할 수 있습니다.

업데이트 : 이전 Visual Studio 6을 제거하고 VB6 응용 프로그램을 만들어 C# COM 서버를 테스트 한 결과 제대로 작동했습니다.

그래서 vb6 프로젝트에 디 컴파일 된 코드를 출력 할 수있는 무료 vb6 디 컴파일러를 가져 와서 COM 서버를로드하려는 타사 응용 프로그램에서 실행했습니다. 작동하지 않는 것을 보았습니다.

자신의 응용 프로그램이 디자이너의 컨트롤로 COM 서버를 사용하고 있고 테스트 프로그램이 WithEvents 형식의 멤버 변수를 선언 한 것으로 나타났습니다. 이 문제를 일으키는 디자이너와 함께 무언가가 진행되고 있습니까? COM 서버 ActiveX를 호환 가능하게하려면 어떻게합니까? 또한 VB6 ide는 도구 상자에 컨트롤로 C# com 서버를 추가 할 수 없다는 것을 알았습니다.

답변

1

, 나는이 날을 가져 C#에서 ActiveX 컨트롤을 구현하는 예를 보았다.

은 분명히 UserControl을 당신은 아마 추가 잊은

1

나는이 오류가 직접 발생했음을 기억합니다. 런타임에 COM 등록을 이벤트에 매핑하는 방법을 모르는 것 같습니다.

내가 한 일을 살펴보기 위해 되돌아 보았습니다. 내가 볼 수있는 유일한 차이점은 위임자 정의가 내 COM 클래스 내에 있으며,이 내용은이 example에서 발생하는 것으로 나타났습니다.

그래서 다음과 같이 MyClass에의 안쪽이 MyEventAPIHandler를 이동하려고 : 내가 제어하지 UserControl에서 파생 된

[ComVisible(true), 
     Guid(Constants.CLASS_IID), 
     ProgId(Constants.PROG_ID), 
     ClassInterface(ClassInterfaceType.None), 
     ComSourceInterfaces(typeof(IMyServiceEvents))] 
    public class MyClass : Control, IMyService, IMyServiceEvents 
    { 
     [ComVisible(false)] 
     public delegate void MyEventHandler(int Status); 

     [DispId(1)] 
     public event MyEventHandler MyEvent; 



     //... also implements IMyService, which is working 
    } 

    [ComVisible(true), 
     InterfaceType(ComInterfaceType.InterfaceIsIDispatch), 
     Guid(Constants.EVENTS_IID)] 
    public interface IMyServiceEvents 
    { 
     [PreserveSig, DispId(1)] 
     void MyEvent([In]int Status); 
    } 
+0

잘 시도했지만 작동하지 않았습니다. 그들의 vb6 코드가 .Net CCW가 이벤트를 처리하도록 허용하지 않는 무언가를 잘못하고 있는지 궁금합니다. 또한 여러 가지 시도, snk 추가 및 어셈블리를 GAC 대 regasm/codebase를 사용하여 퍼팅,하지만 아무것도 작동하는 것. 그러나 표준 방법은 정상적으로 작동합니다. – jonathanpeppers

0

알고 제대로이 일을 ... 만드는 몇 가지 인터페이스 ... 구현 [어셈블리 : GUID를 ("...")] 프로젝트에 , 이는 C# 프로젝트를 다시 컴파일 할 때마다 COM의 TypeLib ID가 변경된다는 것을 의미합니다.

속성이 없으면 컴파일러에서 다른 typelibrary를 생성하지만 일부 COM 함수는 라이브러리 ID와 일치하지 않으면 작동합니다.

+0

이것은 오래 전에 _이었습니다. 하지만 그게 문제라고 생각하지 않습니다. – jonathanpeppers

관련 문제