5

分離展開でネイティブ COM dll のいくつかのクラスを使用するアプリケーションがあります。

簡略化:

  1. 実行時に、マニフェスト ファイルを含む dll を登録せずに特定のディレクトリにダウンロードします。

  2. 次に、そのディレクトリを指すアクティベーション コンテキストを作成し、その後、dll からクラスのインスタンスを作成します。

  3. クラスAを作成し、しばらくしてクラスBを作成するとしましょう。

この流れですべてうまくいきます。

アプリケーションを WinForm に変更したときに問題が発生しました。「ボタン 1」が押されると、前と同じようにアクティベーション コンテキストを作成し、次にクラス A のインスタンスを作成します。これはうまく機能し、フローは WinForm に戻ります。ただし、「ボタン 2」を押すと、クラス B の作成に失敗します。クラスが見つからないという例外が発生します。

そのため、WinForm が何らかの形で私のアクティベーション コンテキストを台無しにしているようです。

  • 何故ですか?そこで何が起こっているのですか?

  • それを回避する方法はありますか?

いくつかのメモ:

  • sxstrace.exe を使用してアクティベーション コンテキストの作成を追跡しようとしましたが、アクティベーション コンテキストの作成のみがログに記録されました。

  • Application.EnableVisualStyles() をコメントアウトしようとしましたが、役に立ちませんでした。

  • アクティベーションコンテキストの作成と破棄でdllへの各呼び出しをラップすると機能しますが、当然そこに行きたくありません...

4

1 に答える 1

1

CLR は、マネージ コードを通過するときに Win32 アクティベーション コンテキストを維持/保持することを保証しません。

回避策は、ネイティブ コードを呼び出し、そこでアクティベーション コンテキストを設定し、必要な処理を行ってから、コンテキストを復元することです。おそらく、オブジェクトのロードとバインドにのみ必要なので、IUnknown を取得したら、それを返すことができます。

マーティン

于 2011-05-06T04:10:29.283 に答える