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 측의 이벤트 또는 추가 핸들러에 가입을하고 있습니까?
이 문제를 해결하는 방법에 대한 도움을 주시면 감사하겠습니다.
내 문제는 ASP.NET과는 아무 상관이없는, 그냥 COM 상호 운용성 문제입니다, 다른 .NET 응용 프로그램은 문제 – Bond
@Bond, 당신은 포인트를 누락 설명하기 위해 할 것입니다. 이벤트가 필요하지 않습니다. 필요한 것은 없으므로 NOT USING EVENTS로 COM interop 문제를 피하십시오. EVENT-LIKE NAMES 기능 만 있으면 이벤트가 발생할 때 호출 할 수 있습니다. 이것은 COM 이벤트가 다른 이벤트이기 때문입니다. 방금 배운 것처럼 ASP.NET에서 이벤트가 발생하기 쉽습니다. – Ben
tlbexp가 이벤트를 추가/제거 메소드 쌍으로 내보내고 .NET 측에서 이벤트를 구독 할 때 이러한 메소드가 호출된다는 사실은 저에게 작동하도록하는 몇 가지 방법이 있다고 생각하게 만듭니다. – Bond