1

Visual Studio Tools for Office (VSTO) を使用して office:word アドインを作成しました。アドインのロード動作を「0」に変更して、自動ロード動作を停止しました。

私の要件は、ac# アプリケーションから Word ドキュメントを開始し、この Word インスタンスに対してのみアドインを有効にすることです。

Using Word = Microsoft.Office.Interop.Word;

{
  Word.Application wordApp;

  //Instantiate a word application
  wordApp = new Word.Application();
  wordApp.visible = true;

  // Open a document
  wordApp.Documents.Open(ref wordFile, ref Missing.value, ..... etc );  

  foreach (Word.AddIns addins in wordApp.Application.AddIns)
       MessageBox.Show(addins.ToString());
}

for ループは例外をスローします:

Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Word.AddIn'  

* アドイン/COMaddins のリストを取得/保存/反復する方法 *

よろしく、

4

2 に答える 2

0

私たち全員が知っているように、アプリケーションレベルのアドインは特定のアプリケーションのすべてのインスタンスに適用できます。Office 2007のアプリケーションの特定のインスタンス(WordおよびExcel)に対してのみアプリケーションレベルのアドインを有効にすることに成功しました。たとえば、ac#アプリケーションからwordインスタンスを起動した場合、アプリケーションレベルのアドイン(カスタムリボン機能)はそのインスタンスにのみ適用され、手動で起動された他のすべてのインスタンスの動作は正常です。

すべてのアプリケーションレベルのアドインは、それ自体をレジストリに登録します。したがって、アプリケーションのすべてのインスタンスがアドインを読み込もうとします。したがって、主な回避策はリボンのロードにあります。

実行時に、カスタムリボンとベーシックリボンのどちらをロードするかを決定する必要があります。

このために、
->オフィスアプリケーション(word / excel)をインスタンス化するc#アプリケーションでプロセス固有の環境変数を作成します。

System.Environment.SetEnvironmentVariable("MyVar", "1", EnvironmentVariableTarget.Process);  

->アドインのリボンクラスの変数を確認します。変数が存在する場合はカスタムリボンをロードし、存在しない場合はベーシックリボンをロードします。

public string GetCustomUI(string ribbonID)
{
   if (System.Environment.GetEnvironmentVariable("MyVar", EnvironmentVariableTarget.Process) == "1")
   {
        return GetResourceText("ExcelAddIn.ExcelRibbon.xml");
   }
   else
   {
        return GetResourceText("ExcelAddIn.BasicRibbon.xml");
   }
}

ほぼ完了です!。ただし、Windowsでは、一度に2つのword / excelインスタンス(.exe)を維持することはできません。そのため、各単語/ Excelインスタンスは同じ.EXEから開き、アドインはすべてのインスタンスに適用されます。したがって、word / excelの各インスタンス(.exe)を分離します。

これを達成するためのレジストリハックがあります:
キーでは、

HKEY_CLASSES_ROOT\Word.Document.12\shell\Open\Command

デフォルトのキー値に「%1」を追加し、コマンドキーの名前を変更します。
キーでは、

HKEY_CLASSES_ROOT\Word.Document.12\shell\Open

ddeexecキーの名前を変更します。

よろしく、

于 2013-02-21T07:01:27.820 に答える
0

最後に、私の問題の解決策を見つけました:

// This will return all the word addins
Microsoft.Office.Core.COMAddIns comAddins = wordApp.COMAddIns;

// Iterate through all the addins 
for(Microsoft.Office.Core.COMAddIns addins in wordApp.COMAddIns)
     MessageBox.Show(addin.Description);
于 2013-02-04T09:38:05.810 に答える