全て:
一部の VBA コードを C# に変換する際に問題が発生しています。
ローカル COM サーバーとして機能するサードパーティ アプリがあります。
VBA コードでは、GetObject()を使用して既存のオブジェクトへの参照を取得します。
例えば
Set appHandle = GetObject("", ProgId)
これはうまくいきます。
C# コードにサードパーティ アプリへの参照を追加し、 Marshal.GetActiveObject()を使用して実行中のインスタンスへの参照を取得しようとしました。
例えば
var appModel = (IAppCoModel)Marshal.GetActiveObject(ProgId);
しかし、MK_E_UNAVAILABLEエラーが発生し続けます。
新しいオブジェクトの作成は、C# コードで正常に機能します
例えば
var appModel = new AppCoModel()
これにより、サードパーティのアプリが起動し、それと通信できるようになります。失敗した実行中のインスタンスへの参照を取得しているだけです。
私が試したこと
異なるセキュリティ コンテキスト
VS は管理者モードで実行されていますが、サード パーティのアプリはそうではありません。コマンドライン (非管理者) から C# アプリを実行してみました。まだ失敗しています。
ROT の内容を確認します (Marshal.GetActiveObject( )が C# で MK_E_UNAVAILABLE 例外をスロー
することを示唆)
。それが必要であることを確認するのに十分なCOMを知りません。
すべてのレジストリ エントリ
を確認しました
(私が見る限り) 見栄えがよく、サード パーティ製アプリの作成とインスタンス化、および VBA がそれを見つけるのに十分です。ここで確認する必要がある具体的なことはありますか?
人々ができる提案は大歓迎です。