2012-05-03 33 views
3

我有在VC++中創建的ocx如果它是靜態加載它工作正常,但當我從程序集動態加載它會給出例外。在C#中動態加載非託管OCX

public Assembly assembly; 

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

    } 

它給出以下異常該模塊預期含有集清單。

(從HRESULT異常:0x80131018)

回答

4

您必須執行許多通常在使用工具箱時自動執行的步驟。首先,您必須運行Aximp.exe實用程序來生成.NET互操作程序集。使用Visual Studio命令提示符運行該工具。您將得到兩個程序集,axinterop.foo.dll包含一個派生類,它是從AxHost派生的,並允許您將該控件放置在窗體上。和interop.foo.dll,互操作程序集使COM接口實現了由.NET程序調用的控件。

接下來,您必須確保這些DLL存在於構建目錄中。最好的辦法是將它們添加到您的項目中,並將它們的複製到輸出目錄設置爲「複製,如果更新」。

現在,您可以在代碼中使用Assembly.Load(「axinterop.foo.dll」)來動態加載互操作程序集。

接下來,您必須創建控件的實例,請使用Assembly.CreateInstance()並傳遞AxHost包裝類的類型名稱。如果你不知道它的名字可能是什麼,那麼它不是很明顯,然後使用ildasm.exe來查看axinterop.foo.dll程序集。將返回的對象轉換爲AxHost。

接下來,您必須將控件添加到窗體的Controls集合中,以便它可見並且可用。在創建控件實例之前,您不能調用任何接口方法,直到添加了控件並且表單的Load事件已被觸發纔會發生。

接下來,您必須使用反射或動態關鍵字來獲取對由控件實現的接口的引用,以防需要設置屬性或調用方法。這很難做到,你需要先使用從工具箱中添加的控件編寫代碼,這樣你就不必過於費勁地猜出正確的名稱。


這顯然都很痛苦,很難得到正確的結果。通過將類庫添加到直接使用OCX並通過接口公開其重要屬性的項目中,可以獲得良好結果。並使用上的Assembly.Load()表示之一。

1

Assembly.LoadFile只能加載的.Net組件不是天然DLL/EXE/OCX文件。

您可以通過解決方案管理器添加到OCX文件的引用 - >參考,然後創建OCX類的一個實例。

+0

@logincp,以任何方式動態加載.ocx(native)? – abdul

+0

我想動態不加入參考 – abdul

+0

我認爲你應該改變你的問題,然後 – accfews