如何从其他 C# 项目调用 VSTO 类
本文关键字:调用 VSTO 项目 其他 | 更新日期: 2023-09-27 18:35:37
在我的解决方案中,我有 2 个项目。
一个是控制器,它在最终产品中用于检查执行是否从控制台/非用户输入发出,因此将根据来自 xml 文件的输入在后台执行所需的更改,或者如果执行是由用户输入发出的,这将打开一个界面。
非用户输入可能是一个计划任务或类似的东西,但那是现在的其他时间,我只是为了一些上下文而写。
在这两种情况下,迟早都需要访问word文档以及读取,写入和更改文档属性。
为此,我创建了一个具有所需函数的VSTO-Word-Addin,到目前为止,我对路径进行了硬编码,并且没有在其他文档以外的任何地方返回结果。
由于我确信我在 VSTO 中的代码本身可以工作,因此我想将原型扩展到下一个级别,并尝试在控制台和 VSTO 之间添加连接。
为了进行测试,我正在简化该过程,只是尝试在控制台和VSTO之间建立连接,而无需任何用户输入,并尝试执行一些方法来测试VSTO的功能。
我的方法是打开控制台,然后打开 Word/加载项,打开隐藏的文件并施展魔法。
首先要做的是设置要打开的文档的路径,然后使用返回值调用多个方法。
在这种情况下,我的 VSTO 返回一个 true
SetCustomProperty
和新的元组列表
GetCustomProperties
这些是占位符,将在开发中替换。
我已经尝试了一些可能的解决方案,但大多数解决方案都相反,从VSTO启动WinForms/WPF/控制台,或者尝试从他们的加载项调用其他加载项。
我最成功的方法是这个:
MSDN从其他办公解决方案调用 VSTO 外接程序中的代码
但是,当然这是针对办公室的,所以我遇到了无法使用的问题
Globals
有关全局的详细信息,请参阅MSDN
所以也许我错过了重点,只是盲目,但是如何从控制台调用 VSTO 项目中的类?
以下是我当前失败的一些代码示例:
具有我要访问的已用接口的类:
[ComVisible(true)]
public interface IPropertyReadWriter
{
bool Open(string Path);
bool SetCustomProperty(String Name, PropertyTypes Type, object Value);
List<Tuple<String, PropertyTypes, object>> GetCustomProperties();
}
[ComVisible(true)]
public class PropertyReaderWriter : IPropertyReadWriter
{
public List<Tuple<string, PropertyTypes, object>> GetCustomProperties()
{
return new List<Tuple<string, PropertyTypes, object>>();
}
public bool Open(string Path)
{
return false;
}
public bool SetCustomProperty(string Name, PropertyTypes Type, object Value)
{
return false;
}
}
MSDN 文章中关于从其他办公项目调用的代码:
object addInName = "ExcelImportData";
Office.COMAddIn addIn = Globals.ThisAddIn.Application.COMAddIns.Item(ref addInName);
ExcelImportData.IAddInUtilities utilities = (ExcelImportData.IAddInUtilities)addIn.Object;
utilities.ImportData();
我不知道如何使用它,因为我无法访问 VSTO 的全局站点?
有些类似的问题,所以我可以使用没有答案,因为缺乏上下文或示例:
我不知道Dan Byström的回答是什么意思,Mike Regan的回答也导致了先前陈述的MSDN。
如何从单独的 C# 项目调用 VSTO 加载项方法?
首先,对于要调用的插件,添加一个接口:
[ComVisible(true)]
public interface IExcelUtilities
{
bool DoSomething();
}
接下来,添加一个实现接口的类:
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class AddInUtilities :
StandardOleMarshalObject,
IExcelUtilities
{
public bool DoSomething()
{
return true;
}
}
然后覆盖对象 RequestComAddInAutomationService in ThisAddin.cs:
private AddInUtilities utilities;
protected override object RequestComAddInAutomationService()
{
try
{
if (utilities == null)
{
utilities = new AddInUtilities();
}
return utilities;
}
catch (System.Exception ex)
{
// Catch your ex here
}
}
现在,您应该能够像这样从外部应用程序调用公开的方法:
foreach (COMAddIn comaddin in addins)
{
if (comaddin.ProgId.Equals("YourAddinNameHere", StringComparison.InvariantCultureIgnoreCase) == true)
{
bool returnvalue = comaddin.Object.DoSomething();
break;
}
}
有关此主题的更深入信息,另请阅读:http://blogs.msdn.com/b/andreww/archive/2008/08/11/why-your-comaddin-object-should-derive-from-standardolemarshalobject.aspx
希望有帮助:-)
这不是一个确切的答案,但对于遇到此问题的其他人,文档级解决方案无法向其他解决方案公开接口。
向其他 Microsoft Office 解决方案公开 VSTO 外接程序中的对象。
- VSTO 外接程序项目。从其他 Office 解决方案调用 VSTO 外接程序中的代码