3

VC++ で作成された ocx があります。静的にロードされた場合は正常に動作しますが、アセンブリから動的にロードすると例外が発生します。

    public Assembly assembly;

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

    }

次の例外が発生しますモジュールには、アセンブリマニフェストが含まれていることが期待されていました。

(HRESULT からの例外: 0x80131018)

4

2 に答える 2

5

ツールボックスを使用すると、通常は自動的に実行されるいくつかの手順を実行する必要があります。何よりもまず、Aximp.exe ユーティリティを実行して .NET 相互運用アセンブリを生成する必要があります。Visual Studio コマンド プロンプトを使用してツールを実行します。2 つのアセンブリを取得します。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 イベントが発生するまで発生しません。

次に、プロパティを設定したりメソッドを呼び出したりする必要がある場合に備えて、リフレクションまたはdynamicキーワードを使用して、コントロールによって実装されたインターフェイスへの参照を取得する必要があります。これを正しく理解するのは困難です。最初にツールボックスから追加されたコントロールを使用してそのコードを記述し、適切な名前を難しく推測する必要がないようにする必要があります。


これは明らかにすべて非常に苦痛であり、正しく行うのは困難です. OCX を直接使用し、インターフェイスを介して重要なプロパティを公開するクラス ライブラリをプロジェクトに追加することで、良い結果が得られる可能性が高くなります。そして、その上でAssembly.Load() を使用します。

于 2012-05-03T11:41:56.863 に答える
1

Assembly.LoadFile は、ネイティブの dll/exe/ocx ファイルではなく、.Net アセンブリのみをロードできます。

ソリューション エクスプローラー -> [参照] を使用して ocx ファイルへの参照を追加し、ocx クラスのインスタンスを作成できます。

于 2012-05-03T10:35:35.987 に答える