短いバージョン VB.netとVSTOにWordAddinがあり、Word.COMAddins.Objectを介してCOM互換オブジェクトを公開します。これにより、Word自体へのアクセスをクロスプロセスせずに、Addin機能をWordの外部で呼び出すことができます。 。
この手法はVB6で機能しましたが、VB.netでも機能しますが、タスクペインを介してアドインから直接実行される同じコードよりもはるかに低速であり、呼び出しがすべてクロスプロセスである必要がないかのようになります。バツ
ロングバージョン このアドインは、基本的にWordドキュメントで大量の処理を実行します。アドインは2つの方法で実行できます。
- Word内から、タスクペインを使用して
- 外部的には、COMに公開されている一連のクラスを介して(VB6クライアントアプリへの機能へのアクセスを提供する必要があるため)。
しかし、ここにこすりがあります。Wordの自動化を行ったことのある人なら誰でも、Wordで完全に許容範囲内でINPROCで実行されるコード(この場合、Word自体がロードするADDINのインスタンス)は、通常、許容できないほどゆっくりとプロセス外(またはクロスプロセス)で実行されることを知っています。
このアプリも例外ではありません。
何年も前に、私はこの問題を回避するために便利なトリックを利用しました。
- 通常どおりWordアドインを作成します
- Word.COMAddin.Objectプロパティを介してオブジェクトを公開し、外部コードがアドインにアクセスできるようにします。
- 外部プロジェクトでは、Wordを直接操作する代わりに、Application.COMAddinsコレクションを使用して、アドインを見つけ、そこから公開されたCOMAddin.Objectプロパティを取得してから、そのオブジェクトで作業を行うメソッドを呼び出します。
もちろん、COMAddin.Objectオブジェクトの呼び出しはクロスプロセスのままですが、Wordで処理中のアドインで実行が行われると、アドインは必要なすべてのWordオブジェクト操作を実行できるようになり、高速になります。その時点ですべての処理中の呼び出しを再実行します。
それはVB6COMの時代に機能しました。
しかし、私はこのVB.net vstoアドインをまとめ、VSTOのConnectオブジェクトのRequestComAddInAutomationService関数を介してアドインオブジェクトを公開します。
アドインを外部から呼び出すことができます。これらはすべて、期待どおりに機能します。ただし、Wordを呼び出すコードが、Wordを呼び出すコードであっても、Wordへの呼び出しがクロスプロセスで実行されているのと非常によく似ています。 Wordによって処理中にロードされたアドインdllの一部です!
そして、約10対1のように遅くなります。作業ウィンドウを介してADDINから直接実行する場合、実行に3秒かかりますが、COMADDIN.objectオブジェクトを介して外部コードから呼び出される場合、実行に約30秒かかります。
.net APPDOMAINSなどで何らかの問題が発生していて、.netで+実際に+がクロスプロシージャ呼び出しを構成していると推測していますが、これまでのところ、この種のことを示唆するものは何も見つかりませんでした。
私の次のステップは、いくつかの神秘的な洞察を除いて、再現をコード化することです。これは、プレイ中の要素の数が非常に多いため、トリッキーになる可能性があります。
何かご意見は?