2017-05-13 3 views
-1

컨테이너가 내 자신의 메서드를 호출 할 수 있도록 IPersistStorage 인터페이스의 메서드를 재정의하고 싶지만 컨트롤에서 클래스를 구현해야합니다. 따라서 COM 구성 요소로 컨트롤을 등록 할 때 래퍼 (Com Callable Wrapper)가 구현한다고 생각합니다. IPersistStorage 인터페이스 W 컨테이너는 랩퍼의 메소드를 호출합니다.은 C#에서 컨트롤의 메서드를 재정의합니다. COM 구성 요소

내 클래스의 IPersistStorage 메서드를 재정의하고 Control 클래스 (System.Windows.Forms)를 구현하는 방법은 무엇입니까? 문제는 Control이 아니며 인터페이스 나 클래스에 이러한 메소드가 없습니다.

namespace MiniEye 
{ 
    [ProgId("MiniEye")] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    [ComVisible(true)] 
    [Guid("BBC06458-A67A-4413-81ED-F85E2FCC20CA")] 
    public partial class MiniEye : UserControl 
    { 
     private const string GUID = "BBC06458-A67A-4413-81ED-F85E2FCC20CA"; 
     public MiniEye() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

위의 도구에서 UserControl에서 상속하지 않고 IPersist (때문에 해당 UserControl) IPersistStorage에서와 looks like

클래스 위의 도구는 OLEView에서 상속되는 클래스는 OLEView looks like

+0

이 인터페이스를 Control 클래스에 추가하는 것은 대단히 논리적이지는 않지만, 사용자 정의 할 컨트롤의 클래스를 파생시켜야합니다. [ComVisible] 인터페이스를 추가하십시오. 이것이 직렬화 가능한 컨트롤을 만들려는 시도의 일종이라면 거기에 가지 마라, 잘 끝나지 않을 것이다. –

+0

실제로 작동하지 않습니다. –

+0

멋진. IPersistStorage는 "작동하지 않는"이유가 많기 때문에 C#의 까다로운 인터페이스이며 잘못 선언하고 IPersist에서 메서드를 생략하는 것은 매우 쉽습니다. 그러나 그것이 진정한 이유인지는 알 수 없습니다. –

답변

0

마지막으로 내가 찾아낸 솔루션 : 두 가지 변종이있었습니다.

첫 번째 변형 : "디자인 타임에 설정된 컨트롤 속성을 저장해야합니다. 다시로드 할 수 있어야합니다. 다음 설계 세션 및 런타임시에도 사용할 수 있습니다. 좋은 소식이 여기 있습니다! 공용, "스칼라"(문자열, 숫자 또는 열거 형) 컨트롤 속성은 사용자가 아무것도하지 않아도 자동으로 지속됩니다. " 속성을 사용하여 데이터를 자동 저장하지만이 방법은 사용자가

두 번째 방법은 IUnknown, IDispatch, IOleObject, IViewObject, IPersistStorage와 같은 기본 OLE 인터페이스에서 클래스를 상속하고 모든 메서드를 직접 작성하는 것입니다. 단점은 자신의