zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
  • 相关阅读:
    常用品牌交换机镜像抓包配置
    BGP知识点备忘录
    IS-IS路由协议地址详解
    Linux msmtp+mutt发邮件
    Linux添加一临时用户拥有root权限最快方式
    ELK5.0全程普通用户源码安装指南(CentOS6.5)
    改变文件的拥有者和改变文件的拥有组
    Linux chmod命令详解
    Linux目录介绍
    php时间戳转化成时间相差8小时问题
  • 原文地址:https://www.cnblogs.com/yanlovehan/p/5532740.html
Copyright © 2011-2022 走看看