更改用C#编写的Active-X插件的用户类型名称

本文关键字:用户 插件 类型 Active-X | 更新日期: 2023-09-27 17:58:43

我目前被指派为我们的一个客户创建一个Active-X插件。现在我已经成功地在C#/.NET中创建了Active-X插件(一个继承自System.Windows.Forms.UserControl类的Windows窗体控件),但是托管插件的应用程序在显示Active-X插件的对话框窗口的标题中显示了控件的类名。

经过大量的搜索和分解,我发现方法IOleObject.GetUserType是由主机调用的,主机将此方法的返回值用作对话框窗口的标题。查看System.Windows.Forms.UserControl类,我发现这个类继承自System.Windows.Forms.Control类,后者又显式地实现了System.Windows.Forms.UnsafeNativeMethods.IOleObject接口。

我想知道的是,是否有某种方法可以覆盖GetUserType方法在UserControl类中,或者是否有其他方法可以实现我想要的(也许解决方案非常简单,但到目前为止我还没有看到)。到目前为止,我已经尝试了各种"可能"的解决方案:

  1. 我试图重新实现IOleObject接口,但由于System.Windows.Forms.UnsafeNativeMethods.IOleObject是内部的,所以不可能做到这一点(必须使用完全相同的接口,重新定义接口不会产生完全相同的界面)。

  2. 我已经尝试使用CLR注入,正如Ziad Elmalki在CodeProject中所描述的那样。

  3. 我尝试过使用某种形式的AOP。由于Control类从System.MarshalByRefObject继承到System.ComponentModel.Component,我认为可以让我的用户控件返回某种代理,以拦截发送到GetUserType方法的调用。

不幸的是,我没能让它发挥作用。有效的方法是更改类名,但由于类名不允许有空格或其他特殊字符,这不是一个可接受的解决方案(下划线不一样)。

为了详细说明,这里有一个我想要完成的代码示例(注意它并不完整):

using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
[ ComVisible(true)
, ClassInterface(ClassInterfaceType.AutoDual)
, Description("My Active-X plug-in")
, Guid("...")
]
public partial class MyControl : UserControl
{
    public override int GetUserType(int dwFromOfType, out string userType)
    {
        userType = "The caption to show in the host";
        // Return S_OK
        return 0;
    }
}

希望这里有人能帮我。

提前感谢!

更改用C#编写的Active-X插件的用户类型名称

您可以尝试实现ICustomQueryInterface(.Net 4.0):http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.icustomqueryinterface.aspx

当系统查询IOleObject时,您可以返回自己的实现IOleObject的自定义对象,将您不关心的方法转发给UserControl实现,并将对自定义对象的QueryInterface调用正确委托回UserControl(聚合)。