如何从其他c#项目中调用VSTO类
在我的解决方案中,我有2个项目。
一个是控制器,在最终产品中用于检查是否从控制台/非用户输入发出执行,因此将基于来自xml文件的输入执行所需的后台更改,或者执行是否由用户输入,将打开一个界面。
一个非用户输入可能是一个计划任务或类似的东西,但那是现在的另一个时间,我只是写了一些上下文。
在这两种情况下,迟早都需要访问word文档以及读取,写入和更改文档属性。
为此,我创建了一个带有所需function的VSTO-Word-Addin,到目前为止,我对路径进行了硬编码,并且没有将结果返回到其他文档以外的任何地方。
由于我确信我的VSTO代码本身有效,我想将原型扩展到下一级并尝试在控制台和VSTO之间添加连接。
为了测试我稍微简化了过程,只是尝试在没有任何用户输入的情况下建立控制台和VSTO之间的连接,并尝试执行一些方法来测试我的VSTO的function。
我的方法是打开控制台,然后打开Word /插件,打开隐藏的文件并做魔术。
首先要做的是设置要打开的文档的路径,然后使用返回的值调用多个方法。
在这种情况下,我的VSTO返回true
SetCustomProperty
和一个新的元组列表
GetCustomProperties
这些是占位符,将在开发中被替换。
我已经尝试了一些可能的解决方案,但是大多数都是从VSTO启动WinForms / WPF / Console或尝试从其AddIn调用其他AddIn。
我最成功的方法就是这个:
MSDN从其他Office解决方案的VSTO加载项中调用代码
但当然这是办公室所以我遇到了无法使用的问题
Globals
有关Globals的更多信息,请访问MSDN
所以也许我错过了这一点并且只是盲目的,但我如何从控制台调用VSTO项目中的类?
以下是我当前失败的一些代码示例:
具有我想要访问的已使用接口的类:
[ComVisible(true)] public interface IPropertyReadWriter { bool Open(string Path); bool SetCustomProperty(String Name, PropertyTypes Type, object Value); List<Tuple> GetCustomProperties(); } [ComVisible(true)] public class PropertyReaderWriter : IPropertyReadWriter { public List<Tuple> GetCustomProperties() { return new List<Tuple>(); } 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外的Globals?
因为缺乏上下文或示例,所以我可以使用没有答案的类似问题:
我不知道DanByström对他的回答是什么意思,而Mike Regan的回答也导致了之前陈述的MSDN。
如何从单独的C#项目调用VSTO AddIn方法?
首先,向要调用的Addin添加一个接口:
[ComVisible(true)] public interface IExcelUtilities { bool DoSomething(); }
接下来,添加一个实现接口的类:
[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
希望能帮助到你 :-)
这不是一个完全正确的答案,但对于其他人来说, 文档级解决方案无法将接口暴露给其他解决方案 。
将VSTO加载项中的对象公开给其他Microsoft Office解决方案。
上述就是C#学习教程:如何从其他c#项目中调用VSTO类分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/958734.html