1

マネージド C# DLL (Managed.dll) から使用しようとしているアンマネージド C++/ATL インプロセス COM オブジェクト (Unmanaged.dll 内) があります。しかし、登録不要のCOMを使いたい。私はこれらのステップまでそれを持っています:

  • COM オブジェクトを開発マシンに登録します。インプロセス サーバーには、適切に登録されたタイプ ライブラリが必要です。
  • C# プロジェクト内の COM オブジェクトへの参照を追加し、参照プロパティを Isolated = True に設定します。

これにより、Unmanaged.dll、Managed.dll、および Native.Managed.manifest が生成されます。マニフェストを開くと、システムがマニフェストを使用して、登録不要の方法で COM オブジェクトをロードする方法が明らかです。

これがこすりです。Managed.dll を動的にロードしてパブリック タイプにアクセスするマネージ EXE (Managed.exe) があります。「動的に」とは、Assembly.LoadFrom("Managed.dll") を使用するということです。Managed.dll 内のコードが COM オブジェクトを作成しようとすると、「クラスが登録されていません」という例外が発生します。Managed.dll が読み込まれると、アクティベーション コンテキストが正しく設定されないようです。

このシナリオで登録不要の COM を動作させる方法はありますか?

4

1 に答える 1

2

2日間返事がないので、その間に私が思いついたのは...

実際、アクティベーション コンテキストは、メイン EXE に関連付けられたマニフェストに基づいて、プロセスの起動時に OS によって設定されているように見えます。つまり、すべての登録不要の COM 関連要素は、プロセスの開始時に Main.exe.manifest に含まれている必要があります。これにより、EXE と DLL の間の分離が解除されます。DLL が COM オブジェクトの作成を担当している場合、EXE マニフェストに reg-free COM 情報が含まれている必要はありません。DLL が読み込まれるときに、DLL に関連付けられたマニフェストがプロセス アクティベーション コンテキストにマージされることを期待していたかもしれませんが、そうではありません。

これを回避するには、COM オブジェクトを作成する前に、DLL で新しいアクティベーション コンテキストを構成する必要があります。さらに悪いことに、現在 (.NET 4.0 の時点で) これを行う管理された方法はありません。したがって、DLL は次の Win32 関数を PInvoke する必要があります。

これらの呼び出しを、コンストラクターで CreateActCtx と ActivationActCtx を呼び出し、IDisposable::Dispose で DeativateActCtx と ReleaseActCtx を呼び出すマネージド クラスでラップしました。

于 2011-03-24T14:53:29.433 に答える