2012-07-04 1 views
0

COM 플러그 인을 사용할 수있는 ASP.NET MVC3 웹 사이트가 있습니다. 이를 위해서 어떻게 든 인터페이스를 정의해야합니다. 늘어나는만큼 내가 (COM 전문가가 아니에요) 이해할 수 있습니다.이 중 하나를 .NET에서 수행 할 수 및 tlbexp.exe 또는 idl-> midl-> tlbimp 함께 내보낼 수 있습니다.COM 기반 .net Plugin 프레임 워크

나는 (tlbexp 포함) 첫 번째 방법을 갔다. 나는 IDL을 시도했지만 아무런 쓸모가 없다. (어떤 이유로 든 COM 객체를 .NET의 tlbimp'ed 인터페이스로 다시 던질 수있다.) 내가 tlbexp.exe와 TLB와 regtlibv12과 .TLB를 등록이 수출

[ComVisible(true)] 
[Guid("EFCFB783-0225-4D45-94CB-9A26B7CC19AF")] 
public delegate void ItemStatusChanged(string itemGuid, string itemStatus); 

[ComVisible(true)] 
[Guid("35202AE5-392D-4015-993D-29966DA5DE31")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface ICOMOutputPlugin 
{ 
    void Method1(string arg); 
    void Method2(string arg); 
    event ItemStatusChanged ItemStatusChanged; 
} 

[ComVisible(true)] 
[Guid("93862C43-503C-4C96-9BAE-944F1087AB77")] 
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
public interface ICOMOutputPluginEvents 
{ 
    void ItemStatusChanged(string itemGuid, string itemStatus); 
} 

: 내 인터페이스는 거기에 이벤트를 가지고 있지 않은 경우

이 시나리오는 간단하다. 플러그인 개발자가 인터페이스를 가져 오기 위해이 유형 라이브러리 만 사용합니다.

지금 내가 할 수있는 IDL을 VS2010 새로운 간단한 ATL 개체에 추가하고 변경, 플러그인있을 것 C++ 프로젝트를 :

내 첫 번째 문제는 여기에 있었다
importlib("stdole2.tlb"); 
importlib("MyExp.tlb"); 

[ 
    uuid(E09BC67A-4192-4CA3-8FD0-5CBFC69B43AC)  
] 
coclass DumpToFileOutputPlugin 
{ 
    [default] interface ICOMOutputPlugin; 
    [default, source] dispinterface ICOMOutputPluginEvents; 
}; 

그 어떤 이유로 나는 할 수 없었다 클래스 마법사를 통해 연결 지점을 '정상적인 방법'으로 추가하십시오. MyExp.tlb로 보내면 소스 인터페이스가 표시되지 않습니다. 그래서 저는 그것을 수동으로했습니다 (다른 .tlb를 사용하고 모든 이름을 바꿨습니다).

Type type = Type.GetTypeFromProgID(progID); 
comObject = Activator.CreateInstance(type) as ICOMOutputPlugin; 
comObject.ItemStatusChanged += (guid, status) => ItemStatusChanged(guid, status); 

마지막 줄이 기적적를 호출 : 플러그인 관리자가이 같은 플러그인을 인스턴스화하는 .NET 측면에서

STDMETHOD(add_ItemStatusChanged)(_ItemStatusChanged* value); 
STDMETHOD(remove_ItemStatusChanged)(_ItemStatusChanged* value); 

:

그래서 지금은 COM의 이러한 두 방법과 목적을 가지고 내 COM 개체에 add_ItemStatusChanged 메서드입니다. 저는 여기에 붙어있어

,이 방법에 무엇을 돈 하는가? 내 현재의 구현은 다음과 같습니다

HRESULT CDumpToFileOutputPlugin::add_ItemStatusChanged(_ItemStatusChanged* value) 
{ 
     DWORD cookie; 
     HRESULT ret = Advise(value, &cookie); 
     _com_error err(ret); 
     LPCTSTR errMsg = err.ErrorMessage(); 
     return ret; 
} 

RET = CONNECT_E_CANNOTCONNECT (0x80040202)와에 errmsg는 "의 IDispatch 오류 # 2"를 말한다. 분명히 Advise는 대리자가 전달한 연결점 인터페이스 ICOMOutputPluginEvents을 구현하기 위해 COM 개체가 전달 될 것으로 예상합니다. 어떻게해야합니까?

내가 잘못 .NET 측의 이벤트 또는 추가 핸들러에 가입을하고 있습니까?

이 문제를 해결하는 방법에 대한 도움을 주시면 감사하겠습니다.

답변

-1

가 ASP.Net에 대한 COM 플러그인에서 "이벤트"를 사용하지 마십시오, 당신이 전화 방법이있다. 나는. 이벤트가 아닌 OnEventName이라는 메소드.

COM 이벤트는 웹 양식 포스트 백을 처리하기위한 물건의 오른쪽 종류하지 않습니다.

+0

내 문제는 ASP.NET과는 아무 상관이없는, 그냥 COM 상호 운용성 문제입니다, 다른 .NET 응용 프로그램은 문제 – Bond

+0

@Bond, 당신은 포인트를 누락 설명하기 위해 할 것입니다. 이벤트가 필요하지 않습니다. 필요한 것은 없으므로 NOT USING EVENTS로 COM interop 문제를 피하십시오. EVENT-LIKE NAMES 기능 만 있으면 이벤트가 발생할 때 호출 할 수 있습니다. 이것은 COM 이벤트가 다른 이벤트이기 때문입니다. 방금 배운 것처럼 ASP.NET에서 이벤트가 발생하기 쉽습니다. – Ben

+0

tlbexp가 이벤트를 추가/제거 메소드 쌍으로 내보내고 .NET 측에서 이벤트를 구독 할 때 이러한 메소드가 호출된다는 사실은 저에게 작동하도록하는 몇 가지 방법이 있다고 생각하게 만듭니다. – Bond