C#组件事件? [英] C# component events?
问题描述
我试图写一个C#组件,它会公开事件。该组件是由非托管C ++应用程序导入。据一些教程我想出了这个code(对于C#方):
I am attempting to write a C# component which will expose events. The component is to be imported by an unmanaged C++ application. According to a few tutorials I have come up with this code (for the C# side):
namespace COMTest
{
[ComVisible(true),
Guid("02271CDF-BDB9-4cfe-B65B-2FA58FF1F64B"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ITestEvents
{
void OnTest();
}
[ComVisible(true),
Guid("87BA4D3A-868E-4233-A324-30035154F8A4")]
public interface ITest
{
void RaiseTest();
} // End of ITest
[ComVisible(true),
Guid("410CD174-8933-4f8c-A799-8EE82AF4A9F2"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ITestEvents))]
public class TestImplimentation : ITest
{
public TestImplimentation()
{
}
public void RaiseTest()
{
if (null != OnTest)
OnTest();
}
public delegate void Test (); //No need to expose this delegate
public event Test OnTest;
}
}
现在我的C ++ code有一个简单的:
Now my c++ code has a simple:
#import "COMTest.tlb" named_guids raw_interfaces_only
生成一个TLH文件。此TLH文件包含一切,但我的事件(OnTest)。我在做什么错误?
Which generates a tlh file. This tlh file contains everything but my event (OnTest). What am I doing incorrectly?
推荐答案
COM事件接收器pretty的邪恶的门外汉。
COM Event Sinks are pretty evil to the uninitiated.
步骤基本上都是
- 创建一个输出(源)接口
- 在实现一个 的IConnectionPointContainer和 的IConnectionPoint接口,使用 这些通过一个客户端实现 源接口
- create an outgoing (source) interface
- Implement an IConnectionPointContainer and IConnectionPoint Interfaces, use these to pass a client implementation of the source Interface
在好的消息是,在互操作命名空间中有属性来帮你做这个(大部分)自动(<一href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comsourceinterfacesattribute.aspx"相对=nofollow> ComSourceInterfacesAttribute )有其使用的这里。
The good news is that in the interop namespace there are attributes to help you do this (mostly) automatically (ComSourceInterfacesAttribute) There is a decent example of its usage here.
这篇关于C#组件事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!