如何在word应用程序中查找插件列表

时间:2013-01-31 09:59:42

标签: c# vsto add-in

我创建了一个办公室:使用Visual Studio工具办公室(VSTO)的单词加载项。 我已经将加载项的loadehavior修改为'0'以停止其自动加载行为。

我的要求是从c#应用程序启动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 *

问候,

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

正如我们所知,应用程序级加载项适用于特定应用程序的所有实例。我成功地为Office 2007的特定应用程序实例启用了应用程序级加载项 - Word和Excel。例如,如果我从c#应用程序启动一个单词实例,我的应用程序级别加载项(自定义功能区功能)将仅适用于该实例,手动启动的所有其他实例的行为将是正常的。

每个应用程序级别的加载项都在注册表中注册。因此,应用程序的每个实例都会尝试加载加载项。因此,主要工作在于加载色带。

在运行时,您必须决定是否加载自定义功能区或基本功能区。

为此,
- >在c#应用程序中创建一个特定于进程的环境变量,您可以在其中实例化您的办公应用程序(word / excel)。

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不允许你一次维护word / excel的两个实例(.exes)。因此,每个单词/ excel实例将从相同的.EXE打开,并且您的加载项将应用于所有实例。因此,将单词/ excel的每个实例(.exe)分开。

有注册表黑客来实现这一点:
在密钥中,

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

将“%1”附加到默认键值并重命名命令键 在密钥中,

HKEY_CLASSES_ROOT\Word.Document.12\shell\Open

重命名ddeexec键。

问候,