17

標準の VSTO アドイン (Word 2010 および Word 2013、x86 のみ) である製品を開発しました。デフォルトでは、インストール時にすべてのユーザーにインストールされます (つまり、アドインのレジストリ エントリが HKLM - に挿入されますHKEY_LOCAL_MACHINE\SOFTWARE\[Wow6432Node]\Microsoft\Office\Word\Addins)。

LoadBehaviorreg キーの値が に設定されている場合0x3(つまり、"Load at Startup")、アドインは問題なく動作しますが、値をLoadBehaviortoに設定している場合0x10(つまり、"Load on demand")、アドインは正常に機能しません。予想:

UAC (および Word が管理者特権で実行されない) によりLoadBehavior、HKLM の の値は から に変更され0x100x9、代わりに HKCU ハイブにLoadBehavior( value を使用して) キーを作成することによってオーバーライドされます。0x9

残念ながら、マニフェスト キーが)と共に HKCU ハイブに存在しない限り、LoadBehaviorこの HKCU オーバーライドされた値は考慮されないことがわかりました。この関連スレッドの詳細: https://social.msdn.microsoft.com/Forums/vstudio/en-US/3776734b-333e-423b-9c08-7c7a441c3e94/load-behavior-and-word-addin?forum=vsto

この問題の「明白な」解決策はManifest、インストール時または各ユーザーが初めてアドインを実行するときに、各ユーザーの HKCU (および HKLM) に を書き込むことです。ただし、このアプローチにはいくつかの重大な欠点があります。

  • アドインをアンインストールするには、すべてのユーザーの HKCU 値を削除して、ユーザーが読み込みの問題を経験するのを防ぐ必要があります (これは推奨されません。また、Active Setup を使用する必要があるなど、他の問題や合併症を引き起こす可能性があります)。
  • (ローミング) HKCU ハイブにこれらの値を持つユーザーは、アドインがインストールされていない同じドメイン内のマシンにログインすると問題が発生します。

LoadBehaviorHKCUで適切に設定されているHKLMからマニフェストが取得されないのはバグでしょうか?LoadBehavior値をオーバーライドする必要なく、HKCU で HKLM をオーバーライドできれば、この問題は解決されると思いますManifest

この問題を克服する方法を知っている人はいますか?

4

2 に答える 2

1

UAC を「通知しない」に設定する以外に、問題を直接解決する方法がわかりません。ただし、基本的にLoad on Demandを可能にする回避策を提案します。

VSTO アドインLoadBehavior0x0(アンロード - 自動的に読み込まない) に変更し、自動的に読み込まれたテンプレートで VBA コマンドを使用して、アドインがいつ読み込まれるかを制御することをお勧めします。実行する手順の概要は次のとおりです。

  1. Visual Studio で、アドインのリボンが XML ファイルとしてコーディングされていることを確認します (ビジュアル デザイナーを使用して作成されたものではありません)。このリボン内でカスタム名前空間を定義します。
  2. Word テンプレートを作成します ( .dotm)。Microsoft Officeのカスタム UI エディターを使用して、このテンプレート内にリボン タブの XML を埋め込みます。リボン タブの XML は、アドインのものと同じようにラベル付けされ、配置されます。Visual Studio XML コードと同じ名前空間を XML で定義して、同じ名前空間を共有するようにします。また、アドインをロードするボタンを定義します (おそらく、アドイン内で追加の機能も実行します)。
  3. 0x0テンプレート内で、次のコードを使用して、アンロードされたアドインをロードするサブを記述します。

    Application.COMAddIns(ProgID).Connect = True

    ProgIDProgID のアイテム idex または引用符で囲まれた ProgID の実際の名前のいずれかです。

  4. テンプレート内で、コードを呼び出してボタンからアドインをロードするコールバックを記述します。

  5. テンプレートを Word の STARTUP ディレクトリに配置します。Word 2010 の場合C:\Program Files (x86)\Microsoft Office\Office14\STARTUP

ここで実現したいことは、Word の起動時に VSTO アドインがインストールされてもロードされないことです。作成したテンプレートは STARTUP ディレクトリから自動的に読み込まれ、アプリケーションのリボン タブが Word 内に配置されます。VSTO アドインが読み込まれていないため、これらのコントロールは現在表示されていません。ただし、上記の手順を実装した後、テンプレートの XML からボタンをクリックすると、名前空間を共有するため、アドインはそのコントロールを同じリボンに読み込みます。また、Word を閉じて再起動すると、VSTO アドインがインストールされているが読み込まれていない状態にリセットされます。

これをさらに一歩進めて、VSTO アドイン コントロールを読み込む余分なクリックを回避したい場合は、おそらくテンプレート内で VSTO アドインの XML を再作成し、各コントロールでコードを呼び出して VSTO アドインを読み込み、テンプレートのリボン コントロールを非表示にすることができます。アドインの機能を実行します。このようにして、テンプレートの XML によってプレースホルダー リボンが提供され、実際のアドインがアクションをオンデマンドでロードして実行します。

于 2015-12-21T23:34:14.853 に答える
0

ロード オン デマンドを使用している理由として最も可能性が高いのは、MSDNで説明されているように、起動時のパフォーマンスを向上させることです。ただし、ロード オン デマンドにはさまざまな問題があります (動的なリボン UI の状態がサポートされていない、HKLM の展開に関する問題など)。

すでに述べたように、 Load at Startupには問題はありません。したがって、アドインを読み込む推奨される方法は、 のLoadBehavior値を使用することです0x3

アドインの読み込みパフォーマンスの問題に直面している場合、1 つの解決策として、起動時に常に読み込まれる軽量のアドインを使用し、このアドインが実際のアドインのローダーとして機能することがあります。

于 2015-12-03T10:02:59.033 に答える