Share data between VSTO and Excel DNA App domains

Is there a way to share data between a VSTO add in and an Excel DNA add in? Or can the Excel DNA add in be loaded into the VSTO‘s app domain?

The Excel-DNA add-in will always be in a separate AppDomain. You might try to pass an object via the AddIn‘s Object property. Any MarshalByRef object works across AppDomains, but you need make the initial link...

Finally I ended up with this approach:

1) Put the sharable objects in a class lib and mark them COM visible:

namespace SharedLib
{
    using System.Runtime.InteropServices;

    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface ISharedObject
    {
        int GetVSTOInstanceNumber();
    }

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public class SharedObject : ISharedObject
    {
        private readonly int seed;

        private int serial;

        public SharedObject(int seed)
        {
            this.seed = seed;
        }

        public int GetVSTOInstanceNumber()
        {
            return ++serial + this.seed;
        }
    }
}

2) In VSTO create an instance of the shareable object and expose it via RequestComAddInAutomationService:

namespace SampleExcelAddIn
{
    using SharedLib;

    public partial class ThisAddIn
    {
        private const int Seed = 10;

        private ISharedObject sharedObject;

        protected override object RequestComAddInAutomationService()
        {
            if (sharedObject == null)
            {
                sharedObject = new SharedObject(Seed);
            }

            return sharedObject;
        }

... code removed for brevity ...

    }
}

3) Now consume the shared object in the Excel DNA class lib:

namespace ExcelFunctions
{
    using ExcelDna.Integration;
    using Excel = Microsoft.Office.Interop.Excel;
    using SharedLib;

    public class ExcelFunctions
    {
        [ExcelFunction(Description = "Gets a serial number from the VSTO")]
        public static int GetVSTOInstanceNumber()
        {
            var application = (Excel.Application)ExcelDnaUtil.Application;
            object addinName = "SampleExcelAddIn";
            var addin = application.COMAddIns.Item(ref addinName);
            var utils = (ISharedObject)addin.Object;
            return utils.GetVSTOInstanceNumber();
        }
    }
}
时间: 2024-11-24 22:59:32

Share data between VSTO and Excel DNA App domains的相关文章

Excel DNA学习笔记(二)简单的UDF自定义函数

如何通过使用Excel DNA给Excel添加一个自定义的函数? 1.在类库项目上新建一个类文件,我们姑且叫他MyUdf.cs 2.在这个类中添加一个静态的方法,具体写法如下:注意:一定要是静态的方法 public class MyUdf { [ExcelFunction(Name = "Say", Description = "My first .NET function", Category = "这是类别分组")] public stati

IIS app pools, worker processes, app domains

Copy from  http://stackoverflow.com/questions/14105345/iis-app-pools-worker-processes-app-domains I try to say them with other words. In a server you can have many asp.net sites that runs together. Each one site is an app domain. You must assign to e

VSTO:使用C#开发Excel、Word【12】

Excel对象模型中的事件了解excel对象模型中的事件至关重要,因为这通常是代码运行的主要方式.本章将检查Excel对象模型中的所有事件,引发事件以及可能与这些事件关联的代码类型. Excel对象模型中的许多事件在应用程序,工作簿和工作表对象上重复.此重复允许您决定是否要处理所有工作簿,特定工作簿或特定工作表的事件.例如,如果您想知道任何打开的工作簿中的任何工作表是否双击,您将处理Application对象的SheetBeforeDoubleClick事件.如果您想知道在特定工作簿中的任何工作

VSTO:使用C#开发Excel、Word【9】

文件背后的代码VSTO支持文档背后的代码,要求开发人员使用VSTO项目中生成的具有预连接上下文和预连接事件的类.这些类有时被称为"代码后面"类,因为它们是与特定文档或工作表相关联的代码.在Word中,与文档对应的类后面有一个代码.在Excel中,工作簿中的classone有多个代码,工作簿中的每个工作表或图表工作表都有一个代码. 您的代码在文档项目后面的VSTO代码中第一次运行时,当Office引发由为您创建的类后面的任何代码处理的Startup事件. VSTO通过您正在编写代码的类的

VSTO:使用C#开发Excel、Word【5】

第一部分:VSTO介绍本书的第一部分介绍了Office对象模型和Office主互操作程序集(PIA).您还将学习如何使用Visual Studio使用Visual Studio 2005 Tools for Office(VSTO)的功能来构建文档后面的自动化可执行文件,加载项和代码. 第一章"办公编程介绍"介绍了Office对象模型,并对其基本结构进行了研究.本章介绍如何使用对象,集合和枚举所有Office对象模型中找到的基本类型.您还将学习如何使用Office对象模型中的对象和集合

VSTO:使用C#开发Excel、Word【14】

操作workbooks集合可从Application对象的Workbooks属性中获取的Workbooks集合包含当前在应用程序中打开的Workbook对象的集合. 它还具有用于管理开放工作簿,创建新工作簿以及打开现有工作簿文件的方法. 迭代开放式工作簿集合实现一个称为GetEnumerator的特殊方法,允许它们被迭代. 您不必直接调用GetEnumerator方法,因为C#中的foreach关键字使用此方法遍历一组工作簿. 有关使用foreach的示例,请参见清单5-8. 清单5-8  使用

VSTO学习笔记(二)Excel对象模型

原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO开发中方方面面,本人接触VSTO时间不长,也是一次尝试.鉴于Excel在整个Office家族中的重要地位,故先从Excel开始介绍,后续内容会陆续介绍Word.PowerPoint.Outlook.InfoPath等.由于VSTO 4.0建立在Office 2010基础之上,先介绍一下Office

VSTO学习笔记(九)浅谈Excel内容比较

原文:VSTO学习笔记(九)浅谈Excel内容比较 说起文件内容比较,或许我们首先想到的是UltraCompare这类专业比较的软件,其功能非常强大,能够对基于文本的文件内容作出快速.准确的比较,有详细的差异报告,非常便于分析.其实,各种版本控制软件中也包含有或多或少的比较功能,如TFS.CVS.SVN等.但是如果待比较的文件不是基于文本类型的,那就无能为力了.今天我就来谈一谈Excel的比较方法及其特点,也和大家共同探讨一下,如果你有更好的方法,欢迎分享. 一.Excel的文件架构 Excel

VSTO开发指南(VB2013版) 第四章 Excel编程

实例1:处理NewWorkbook和WorkSheet事件的控制台程序 书本第70页 程序清单 4.1 处理NewWorkbook和WorkSheet事件的控制台程序 Imports Excel = Microsoft.Office.Interop.Excel Imports System.Windows.Forms Module Module1 Private WithEvents app As Excel.Application Private WithEvents workbook As