如何访问动态加载的com的方法?

时间:2014-05-01 11:35:01

标签: c# com com-interop ocx activexobject

对于我的应用程序,我必须动态加载.ocx文件。我可以通过以下代码

来做到这一点
    private void InitializeComponent(string strProgId)
    {
        ResourceManager resources = new ResourceManager(typeof(AxForm));

        Type type = Type.GetTypeFromProgID(strProgId, true);
        m_axCtrl = new AxControl(type.GUID.ToString());

        ((ISupportInitialize)(m_axCtrl)).BeginInit();
        SuspendLayout();

        m_axCtrl.Enabled = true;
        m_axCtrl.Name = "axCtrl";
        m_axCtrl.TabIndex = 0;

        Controls.Add(m_axCtrl);

        Name = "AxForm";
        ((ISupportInitialize)(m_axCtrl)).EndInit();
        Resize += new EventHandler(AxForm_Resize);
        ResumeLayout(false);
        OnResize();
        Show();
    }

但我的下一个问题是我不知道如何访问动态加载控件的属性和方法。我怎样才能实现这一目标?请帮帮我

2 个答案:

答案 0 :(得分:3)

您应该可以使用' dynamic'伪类型关键字。它永远不会在编译时失败,只在运行时(因此你必须仔细定义调用,以便它们与基础定义匹配),就像这样(我想你在OCX上有2个方法):

dynamic ocx = m_axCtrl.GetOcx();
ocx.DoThis(arg1, arg2);
ocx.DoThat();

答案 1 :(得分:1)

你必须使用反射。

例如: 假设您有一个名为LoadFile的方法。

然后:

m_axCtrl.GetOcx().GetType().InvokeMember("LoadFile", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, m_axCtrl.GetOcx(), new object[1] { path });