我创建了一个办公室:使用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 *
问候,
答案 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键。
问候,