在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近做一个vsto的项目,涉及到Form程序调用vsto动态库,弄了半天,搜了很多资料终于搞定了,把积累写下来备以后用。 https://stackoverflow.com/questions/10875278/vsto-add-ins-comaddins-and-requestcomaddinautomationservice
Demo: 1. 建立一个word外接程序(addin) namespace WordVSTOTest { public partial class ThisAddIn { private AddinUtilities addinUtilities; protected override object RequestComAddInAutomationService() { if (addinUtilities == null) { addinUtilities = new AddinUtilities(); } return addinUtilities; } } } 注意到AddinUtilities 没有定义,是的,这是个自定义类,名字随便,但要保持一致,里面要封装你要导出的供外部调用的函数。 2. 添加一个类 using System.Runtime.InteropServices; namespace WordVSTOTest { [ComVisible(true)] [InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface IAddinUtilities { void test(); } [ComVisible(true)] [ClassInterface(ClassInterfaceType.None)] public class AddinUtilities : StandardOleMarshalObject, IAddinUtilities { void test() { MessageBox.Show("Hello World"); } } } 这里定义一个接口类型,接口类型里面的函数就是要导出供外部调用的函数,需要什么函数就些什么函数,和普通函数无区别,然后我们的AddinUtilities类要继承这个接口,最后依次实现定义的函数就可以了。我这里是导出了test函数,简单弹个框。 3. 编译 4. 建立一个WinForm工程 public Word.Application app; public IAddinUtilities utils; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { app = new Word.Application(); string str = app.Name; app.Visible = false; object addinName = "WordVSTOTest"; COMAddIn addin = app.COMAddIns.Item(ref addinName); utils = (IAddinUtilities)addin.Object; utils.test(); //如果没有这个Quit的话,任务管理器的WINWORD.exe不会退出,越来越多。 ((Word._Application)app).Quit(); System.Runtime.InteropServices.Marshal.FinalReleaseComObject(app); } 注意工程需要using以下几项:
查看运行结果: 5. 结束。
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论