2010-08-18 6 views
4

COM 개체 및 트리거 이벤트에 문제가 있습니다. 내가 가진 : 이벤트 Delphi의 COM을 통해 .NET DLL에서 이벤트를 트리거 할 때의 문제

  • COM 개체로 DLL을 사용과 Delphi5에서 응용 프로그램을 트리거 C# .NET을 (3.5)로 작성

    • DLL을.

    지금까지 그렇게 좋았습니다. 이벤트는 다음과 같습니다 : - DLL에는 2 개의 이벤트가 있습니다. 하나는 내부이며 COM으로 볼 수 없습니다. 두 번째는 외부이며 COM 으로 볼 수 있습니다. 내부 이벤트에 연결되어 있고 외부 이벤트를 트리거하는 OnChanged 함수가 DLL에 있습니다. 따라서 기본적으로 내부 이벤트가 트리거 될 때마다 외부 이벤트도 트리거됩니다. -이 OnChanged 함수도 COM으로 표시되며 Delphi 앱에서 호출 할 수 있습니다.

    this solution을 사용하여 모든 작업을 수행 할 수 있었지만 .NET 이벤트에 대한 Delphi 프로 시저를 성공적으로 바인딩 할 수 있지만 catch가 있습니다. - Delphi 앱에서 OnChanged를 호출하면 바인딩 된 Delphi 함수가 .NET 함수뿐만 아니라 (분명히) 실행될 것입니다. - DLL에서 .NET의 콜백 함수에서 OnChanged를 호출하면 바인딩 된 Delphi 함수 실행되지 않습니다.

    하단 라인 : 델파이에서 외부 이벤트를 트리거하면 모든 것이 정상입니다. DLL이 내부 이벤트를 트리거하는 경우 Delphi에서 아무 것도 발생하지 않습니다 (외부 이벤트가 트리거 되었음에도 불구하고).

    모든 아이디어는 높이 평가됩니다!

  • +0

    일부 코드를 제공하고 제공 한 StackOverflow 항목의 답에서 주어진 모든 것을 수행했는지 확인할 수 있습니까? –

    +0

    다음은 시작을위한 전체 예제입니다. http://www.systemwidgets.com/Blog/tabid/61/articleType/ArticleView/articleId/271/C-COM-server-to-Delphi-COM-clients.aspx –

    답변

    0

    실제 코드를 디버깅하지 않고 대답하는 것은 매우 어렵지만 이전에 COM interop에서 만난 한 가지 문제에 대해 알려 드리겠습니다.

    대면 할 수있는 가능성 중 하나는 GC가 이벤트 연결을 해제한다는 것입니다. 개체의 이벤트에 연결할 때 이벤트는 일반적으로 첨부 파일에서 참조를 가져오고 두 개체는 GC에 의해 정리되지 않지만 COM 개체가있을 때 GC는 해당 참조를 반드시 알 필요는 없으며 개체 중 하나를 정리할 수 있습니다. 나는 과거에 .net을 통한 사무 자동화를 통해이 문제를 겪었습니다. 이 문제를 해결하는 방법은 COM 개체에 대한 참조를 유지하고 연결하는 것입니다.

    예를 들어이 나쁜 : obj는 .NET 개체 인 경우

    public class Foo 
    { 
        public Foo(ICOMObject obj) 
        { 
        obj.Changed += OnChanged; 
        } 
    
        private void OnChanged(object arg) 
        { 
        } 
    } 
    

    가 잘 작동합니다. 이벤트 중 하나가 참조 된 상태로 유지되는 한 이벤트는 연결됩니다. 그러나이 COM 개체를 작동하지 않습니다. COM 개체를 사용하면 이벤트가 특정 시점 (대개 다소 빠름)에서 작동을 멈추는 것처럼 보입니다.

    public class Foo 
    { 
        ICOMObject obj; 
        public Foo(ICOMObject obj) 
        { 
        this.obj = obj; 
        this.obj.Changed += OnChanged; 
        } 
    
        private void OnChanged(object arg) 
        { 
        } 
    } 
    

    나는이 문제인지 모르겠어요하지만 수 있습니다 :

    대신 이것을 시도. 행운을 빕니다!

    관련 문제