使用C#开发用户控件,供IE浏览器调用,除了应用程序属性中程序集信息窗口的“使程序集COM可见”和 生成中的“为COM互操作注册”要打勾外,还要求方法/函数的返回值不能是void,COM中是一般返回HRESULT, C#中可以用int替换。
[ComImport]
[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
[PreserveSig]
int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);
[PreserveSig()]
int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
}
[Guid("A53DD1E5-CA43-46a8-A51E-231FF7B322E3")]
[ProgId("TestOcx.TextFunc")]
[ComVisible(true)]
public partial class TextFunc : UserControl, IObjectSafety
{
#region IObjectSafety 成员
private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
private const int S_OK = 0;
[PreserveSig]
public int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions)
{
pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
return S_OK;
}
[PreserveSig]
public int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions)
{
return S_OK;
}
#endregion
public TextFunc()
{
InitializeComponent();
}
public int ShowText(string strText)
{
MessageBox.Show(strText);
return S_OK;
}
}
如何方法返回为void,则IE调用该控件为ActiveX时总找不到该方法,经多次尝试,只要不是void方法,都可以正常使用。