最近做一个vsto的项目,涉及到Form程序调用vsto动态库,弄了半天,搜了很多资料终于搞定了,把积累写下来备以后用。
相关网址:

https://stackoverflow.com/questions/10875278/vsto-add-ins-comaddins-and-requestcomaddinautomationservice

https://blogs.msdn.microsoft.com/andreww/2008/08/11/why-your-comaddin-object-should-derive-from-standardolemarshalobject/

https://blogs.msdn.microsoft.com/andreww/2007/01/15/vsto-add-ins-comaddins-and-requestcomaddinautomationservice/

Demo:

1. 建立一个word外接程序(addin)
我的demo建的是WordVSTOTest工程,建好以后在addin.cs文件中添加一个类变量和一个函数。这个函数是必须的。

namespace WordVSTOTest
{
public partial class ThisAddIn
{
private AddinUtilities addinUtilities;
protected override object RequestComAddInAutomationService()
{
if (addinUtilities == null)
{
addinUtilities = new AddinUtilities();
}
return addinUtilities;
} }
}

注意到AddinUtilities 没有定义,是的,这是个自定义类,名字随便,但要保持一致,里面要封装你要导出的供外部调用的函数。

2. 添加一个类
demo的类名叫AddinUtilities,添加如下代码:

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. 编译
这个编译需要设置一下,不然会有很多莫名其妙的错误,首先vs要用管理员启动,然后转到工程属性-->build,在“输出”栏有个
“为COM互操作注册”的复选框,要勾选这个,最后编译。编译过程中如果要提示还有类似没有注册的错误,要用regasm.exe 
注册一下就行了。电脑里搜索到regasm.exe所在的目录,cmd下转到该目录,使用命令:regasm.exe dll绝对路径 /参数。 
编译好的dll要在winForm工程里面使用。

好了vsto这边的工作就做完了,下面转到我们的Form测试工程。

4. 建立一个WinForm工程
Demo为WinFormTest工程,建好以后,在form上拖一个button控件,双击button直接转到click函数处:写入一下代码:

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以下几项:
using WordVSTOTest;
using Word = Microsoft.Office.Interop.Word;
using Microsoft.Office.Core;
引入这些后才可以编译通过。

简单看一下工程截图:

查看运行结果:

5. 结束。
理解这个调用过程还需要对COM有所了解,不明白原理,抄来抄去到时候出现bug也难排查,就到这里吧。

c#WinForm程序调用vsto动态库,已解决的更多相关文章

  1. 应用程序调用dll动态库,参数有vector时崩溃的问题

    引用:http://blog.csdn.net/guoliushui/article/details/43017339 今天跟同事遇到了一个问题,问题背景: 一个动态库Tst.dll: 一个应用程序A ...

  2. C#总结(四)调用C++动态库

    由于公司很多底层的SDK,都是C++开发,上层的应用软件却是C# Winform程序.在实际工作的过程中,就经常碰到了C# 程序调用C++ 动态库的问题.最近一直在和C++ 打交道,C# 怎么调用C+ ...

  3. c#调用c++动态库的一些理解

    调用c++动态库一般我们这样写   [DllImport("UCamer.dll", CallingConvention = CallingConvention.Winapi)] ...

  4. C#调用C++动态库(dll)

    在实际软件开发过程中,由于公司使用了多种语言开发,在C#中可能需要实现某个功能,而该功能可能用其他语言已经实现了,那么我们可以调用其他语言写好的模块吗?还有就是,由于C#开发好的项目,我们可以利用re ...

  5. C#之VS2010ASP.NET页面调用Web Service和winform程序调用Web Service

    一:用ASP.NET调用Web Service 打开VS2010,打开“文件-新建-网站”,选择“ASP.NET网站” 选好存储位置,语言后点击确定,进入默认页面.然后先添加Web引用,把WebSer ...

  6. python调用.net动态库

    # python调用.net动态库 ### pythonnet简介------------------------------ pythonnet是cpython的扩展- pythonnet提供了cp ...

  7. Delphi XE7调用C++动态库出现乱码问题回顾

    事情源于有个客户需使用我们C++的中间件动态库来跟设备连接通讯,但是传入以及传出的字符串指针格式都不正确(出现乱码或是被截断),估计是字符编码的问题导致.以下是解决问题的过程: 我们C++中间件动态库 ...

  8. 使用ctypes在Python中调用C++动态库

    使用ctypes在Python中调用C++动态库 入门操作 使用ctypes库可以直接调用C语言编写的动态库,而如果是调用C++编写的动态库,需要使用extern关键字对动态库的函数进行声明: #in ...

  9. JNI_Android项目中调用.so动态库

    JNI_Android项目中调用.so动态库 2014年6月3日 JNI学习 參考:http://blog.sina.com.cn/s/blog_4298002e01013zk8.html 上一篇笔者 ...

随机推荐

  1. Django框架(十二)—— 补充:inclusion_tag、defer、only、choice、事务、创建多对多的第三张表

    目录 补充:inclusion_tag.defer.only.choice.事务.创建多对多的第三张表 一.inclusion_tag 1.作用 2.使用 二.defer与only 1.定义 2.使用 ...

  2. 前端(十三)—— JavaScript高级:回调函数、闭包、循环绑定、面向对象、定时器

    回调函数.闭包.循环绑定.面向对象.定时器 一.函数高级 1.函数回调 // 回调函数 function callback(data) {} // 逻辑函数 function func(callbac ...

  3. 6个步骤,全方位掌握 Kafka

    毋庸置疑,目前 Apache Kafka 是整个消息引擎领域的执牛耳者,也是大数据生态圈中颇为重量级的一员. 从最早诞生于 LinkedIn 的"分布式消息系统",到现在集成了分发 ...

  4. Codeforces Round #535 F-MST Unification

    题目大意: 给定n m 为图中的点数n和边数m 给定m条边的信息 u v w 为u点到v点有一条长度为w的边 图中无环无重边 这个图的MST的花费为k 但可能存在多种花费为k的MST的方案 此时对图中 ...

  5. 如何在react中实现一个table切换?

    废话不说,直接贴代码,供新手参考 <!DOCTYPE html> export default class TabComponent extends Component { constru ...

  6. C语言结构体数组

    #include <stdio.h> int main() { /*************************************************** *结构体数组:数组 ...

  7. PHP操作XML方法之SimpleXML

    SimpleXML简介 SimpleXML 扩展提供了一个非常简单和易于使用的工具集,能将XML转换成一个带有一般属性选择器和数组迭代器的对象. 举例XML XML结构部分引用自<<深入理 ...

  8. vue 中使用 lazyload 插件 数据更图片不更新 的原因 及解决方案

    在使用lazyload插件的img标签上,加上:key标识即可

  9. d3操作svg路径动画,及dom移动

    图片跟随路径循环运动,dom也跟着路径运动(利用实时获取坐标位置的方法,改变transform) 1,准备路径 a,自己脑补路径 b,在ps上画好,然后在保存成png-24图片,背景透明,在网站htt ...

  10. 快速失败and安全失败

    快速失败: 举个栗子: public static void main(String[] args) { ArrayList<String> list=new ArrayList<& ...