在C#中动态加载非托管OCX

时间:2012-05-03 10:34:31

标签: c# ocx

我在VC ++中创建了ocx如果它是静态加载的,它可以正常工作但是当我从程序集动态加载它时会产生异常。

    public Assembly assembly;

    public Form1()
    {
        InitializeComponent();            
       assembly = Assembly.LoadFile(Application.StartupPath + "\\abc.ocx");

    }

它给出了以下异常该模块应该包含一个程序集清单。

  

(HRESULT异常:0x80131018)

2 个答案:

答案 0 :(得分:4)

您必须执行许多步骤,这些步骤通常在您使用工具箱时自动执行。首先,您必须运行Aximp.exe实用程序来生成.NET互操作程序集。使用Visual Studio命令提示符运行该工具。你将获得两个程序集,axinterop.foo.dll包含一个从AxHost派生的包装类,并允许你将控件放在一个表单上。和interop.foo.dll,互操作程序集,它使控件实现的COM接口可以从.NET程序中调用。

接下来,您必须确保这些DLL存在于构建目录中。最好的办法是将它们添加到您的项目中,并将其Copy to Output Directory设置为“Copy if newer”。

现在您可以在代码中使用Assembly.Load(“axinterop.foo.dll”)来动态加载互操作程序集。

接下来,您必须创建控件的实例,使用Assembly.CreateInstance()并传递AxHost包装类的类型名称。如果你不知道它的名字是什么,那就不明显了,然后使用ildasm.exe来查看axinterop.foo.dll程序集。将返回的对象强制转换为AxHost。

接下来,您必须将控件添加到窗体的Controls集合中,以使其可见且可用。在创建控件实例之前,您不能调用任何接口方法,直到您添加控件并且表单的Load事件被触发后才会发生。

接下来,您必须使用反射或动态关键字来获取对控件实现的接口的引用,以防您需要设置属性或调用方法。这很难做到,你需要首先使用工具箱中添加的控件来编写代码,这样你就不必过于苛刻地使用正确的名称。


这显然都很痛苦,很难做到。通过向直接使用OCX的项目添加类库并通过接口公开其重要属性来提高获得良好结果的几率。并在上使用Assembly.Load()一个。

答案 1 :(得分:1)

Assembly.LoadFile只能加载.Net程序集而不是本机dll / exe / ocx文件。

您可以通过解决方案资源管理器 - >参考添加对ocx文件的引用,然后创建ocx类的实例。