我试图创建一个COM接口,允许回调从COM调用代码。 我似乎无法找到C#这方面的任何适当的解释。
我有一个正常的COM接口的工作,但我不知道如何正确地注册并建立回调的一部分。
我无法找到如何做到这一点适当的在C#中的任何信息,因为大多数谷歌搜索词我能拿出包括“COM”只会导致.COM网站,不包括实际的COM接口谈论回调时和事件,他们只包括默认非COM的。 任何帮助,将不胜感激,哪怕它只是指出在那里我能找到更好的,更有用的信息来源。
我的回调接口看起来是这样的:
using System;
using System.Runtime.InteropServices;
namespace ComAdapter
{
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("7f176b75-7b66-463a-94ab-493943792f88")]
public interface INet40Callback
{
[PreserveSig]
void Callback(string data);
}
}
回调类我想是这样的:
using net40lib;
using System;
using System.Runtime.InteropServices;
namespace ComAdapter
{
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(INet40Callback))]
[Guid("023e4ad9-77d1-461e-af89-4cfc2b53959c")]
public class Net40Callback : INet40CallbackRegistration
{
[ComVisible(false)]
public delegate void MyCallbackDelegate(string data);
public event MyCallbackDelegate Callback;
public INet40Callback callbackObject;
public Net40Callback()
{
Net40Class.Instance.VersionSent += Instance_VersionSent;
}
void Instance_VersionSent(object sender, EventArgs e)
{
if (callbackObject != null)
{
callbackObject.Callback("blah");
}
if (Callback != null)
{
Console.WriteLine("Instance_VersionSent Sending Callback");
Callback("blah");
}
}
public void RegisterCallback(INet40Callback reg)
{
if (reg is INet40Callback)
{
callbackObject = reg as INet40Callback;
}
}
}
}
调用应用程序,到目前为止是这样的:
using ComAdapter;
using System;
using System.Runtime.InteropServices;
namespace net20lib
{
class Net40Callback : INet40Callback
{
[PreserveSig]
public void Callback(string data)
{
Console.WriteLine("Callback Called with data {0}", data);
}
}
}
注册:
using System;
using System.Runtime.InteropServices;
namespace ComAdapter
{
[ComVisible(true)]
[Guid("3b2ab267-9e9a-47be-ab0a-f55db10a971e")]
public interface INet40CallbackRegistration
{
void RegisterCallback(INet40Callback callback);
}
}
从测试类中的呼唤:接口的实现:
internal class Net40Callback : INet40Callback
{
[PreserveSig]
public void Callback(string data)
{
Console.WriteLine("Callback Called with data {0}", data);
}
}
该代码登记:
INet40Callback callback = new Net40Callback();
Type myCallbackType = Type.GetTypeFromProgID("ComAdapter.Net40Callback");
object myCallbackInstance = Activator.CreateInstance(myCallbackType);
INet40CallbackRegistration registration = (INet40CallbackRegistration)myCallbackInstance;
registration.RegisterCallback(callback);