如何从其他 C# 项目调用 VSTO class
How to call VSTO class from other c# project
在我的解决方案中,我有 2 个项目。
一个是控制器,它在最终产品中用于检查是否从 console/non 用户输入发出执行,因此将根据 xml 的输入在后台执行所需的更改]-文件,或者如果执行是由用户输入发出的,这将打开一个界面。
非用户输入可能是计划的任务或类似的东西,但那是另一次了,我只是为了某些上下文而写的。
在这两种情况下,迟早都需要访问 word 文档以及读取、写入和更改文档属性。
为此,我创建了一个具有所需功能的 VSTO-Word-Addin,到目前为止,我对路径进行了硬编码,并且 return 除了其他文档之外,没有其他任何地方的结果。
因为我确定我在 VSTO 中的代码本身可以工作,所以我想将原型扩展到下一个级别并尝试添加控制台和 VSTO 之间的连接。
为了测试,我稍微简化了这个过程,只是尝试在没有任何用户输入的情况下建立控制台和 VSTO 之间的连接,并尝试执行一些方法来测试我的 VSTO 的功能。
我的方法是打开控制台,然后打开 Word/the 插件,打开隐藏的文件并执行魔术。
首先要做的是为要打开的文档设置路径,然后使用 returned 值调用多个方法。
在这种情况下,我的 VSTO return对于
是正确的
SetCustomProperty
以及
的新元组列表
GetCustomProperties
这些是占位符,将在开发中被替换。
我已经尝试了一些可能的解决方案,但大多数解决方案都采用相反的方式从 VSTO 启动 WinForms/WPF/Console 或尝试从其 AddIn 调用其他 AddIn。
我最成功的方法是这个:
MSDN
从其他 Office 解决方案调用 VSTO 加载项中的代码
当然这是办公用的所以遇到了无法使用的问题
Globals
可以找到有关全局变量的更多信息here in MSDN
所以也许我没有抓住要点,只是瞎了眼,但我如何从控制台在 VSTO 项目中调用 class?
以下是我当前失败的一些代码示例:
class我想访问的接口:
[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文章中关于从其他office-project调用的代码:
object addInName = "ExcelImportData";
Office.COMAddIn addIn = Globals.ThisAddIn.Application.COMAddIns.Item(ref addInName);
ExcelImportData.IAddInUtilities utilities = (ExcelImportData.IAddInUtilities)addIn.Object;
utilities.ImportData();
我不知道如何使用它,因为我无法访问 VSTO 外部的全局?
关于 so 的一些类似问题,但我无法使用答案,因为缺乏上下文或示例:
我不知道 Dan Byström 的回答是什么意思,Mike Regan 的回答也导致之前提到的 MSDN。
How to call a VSTO AddIn method from a separate C# project?
首先,为您要调用的插件添加一个接口:
[ComVisible(true)]
public interface IExcelUtilities
{
bool DoSomething();
}
接下来,添加一个实现接口的class:
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class AddInUtilities :
StandardOleMarshalObject,
IExcelUtilities
{
public bool DoSomething()
{
return true;
}
}
然后覆盖 ThisAddin.cs 中的对象 RequestComAddInAutomationService:
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
希望对您有所帮助:-)
这不是一个确切的答案,但对于遇到此问题的其他人,document-level solutions cannot expose interfaces to other solutions。
Expose an object in a VSTO Add-in to other Microsoft Office solutions.
- VSTO Add-in projects. Call code in VSTO Add-ins from other Office solutions
在我的解决方案中,我有 2 个项目。
一个是控制器,它在最终产品中用于检查是否从 console/non 用户输入发出执行,因此将根据 xml 的输入在后台执行所需的更改]-文件,或者如果执行是由用户输入发出的,这将打开一个界面。
非用户输入可能是计划的任务或类似的东西,但那是另一次了,我只是为了某些上下文而写的。
在这两种情况下,迟早都需要访问 word 文档以及读取、写入和更改文档属性。
为此,我创建了一个具有所需功能的 VSTO-Word-Addin,到目前为止,我对路径进行了硬编码,并且 return 除了其他文档之外,没有其他任何地方的结果。
因为我确定我在 VSTO 中的代码本身可以工作,所以我想将原型扩展到下一个级别并尝试添加控制台和 VSTO 之间的连接。
为了测试,我稍微简化了这个过程,只是尝试在没有任何用户输入的情况下建立控制台和 VSTO 之间的连接,并尝试执行一些方法来测试我的 VSTO 的功能。
我的方法是打开控制台,然后打开 Word/the 插件,打开隐藏的文件并执行魔术。
首先要做的是为要打开的文档设置路径,然后使用 returned 值调用多个方法。
在这种情况下,我的 VSTO return对于
是正确的SetCustomProperty
以及
的新元组列表GetCustomProperties
这些是占位符,将在开发中被替换。
我已经尝试了一些可能的解决方案,但大多数解决方案都采用相反的方式从 VSTO 启动 WinForms/WPF/Console 或尝试从其 AddIn 调用其他 AddIn。
我最成功的方法是这个:
MSDN 从其他 Office 解决方案调用 VSTO 加载项中的代码
当然这是办公用的所以遇到了无法使用的问题
Globals
可以找到有关全局变量的更多信息here in MSDN
所以也许我没有抓住要点,只是瞎了眼,但我如何从控制台在 VSTO 项目中调用 class?
以下是我当前失败的一些代码示例:
class我想访问的接口:
[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文章中关于从其他office-project调用的代码:
object addInName = "ExcelImportData";
Office.COMAddIn addIn = Globals.ThisAddIn.Application.COMAddIns.Item(ref addInName);
ExcelImportData.IAddInUtilities utilities = (ExcelImportData.IAddInUtilities)addIn.Object;
utilities.ImportData();
我不知道如何使用它,因为我无法访问 VSTO 外部的全局?
关于 so 的一些类似问题,但我无法使用答案,因为缺乏上下文或示例:
我不知道 Dan Byström 的回答是什么意思,Mike Regan 的回答也导致之前提到的 MSDN。
How to call a VSTO AddIn method from a separate C# project?
首先,为您要调用的插件添加一个接口:
[ComVisible(true)]
public interface IExcelUtilities
{
bool DoSomething();
}
接下来,添加一个实现接口的class:
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class AddInUtilities :
StandardOleMarshalObject,
IExcelUtilities
{
public bool DoSomething()
{
return true;
}
}
然后覆盖 ThisAddin.cs 中的对象 RequestComAddInAutomationService:
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
希望对您有所帮助:-)
这不是一个确切的答案,但对于遇到此问题的其他人,document-level solutions cannot expose interfaces to other solutions。
Expose an object in a VSTO Add-in to other Microsoft Office solutions.
- VSTO Add-in projects. Call code in VSTO Add-ins from other Office solutions