原 利用Appdomain动态加载程序集,

结构图

生成目录和新的appdomain基目录相同,随时生成,随时加载。

接口代码

    public interface FuncProcessings 
    { 
        void GetFunctionMessage(FuncMessage funcMessage);
        string ReturnResult();
    }
    [Serializable]
   public struct FuncMessage
    {
        private string projectMessage;
        private string _head;
        private string _body;
        private string _foot;

        public string Head { get { return _head; } set { _head = value; } }
        public string Body { get { return _body; } set { _body = value; } }
        public string Foot { get { return _foot; } set { _foot = value; } }
        public string ProjectMessage { get { return projectMessage; } set { projectMessage = value;     }

这里构造的类和结构体需要加上serializable序列化特性,用于数据传输

处理逻辑

public class Processing : MarshalByRefObject, ProcessingInterface.FuncProcessings
    {
        public Processing()
        { }
        public void GetFunctionMessage(FuncMessage funcMessage)
        {
            string basePath = string.Empty;
            string activingFile = string.Empty;
            string selectedTest = string.Empty;
            string[] projrctStr = funcMessage.ProjectMessage.Split('$');
            if (projrctStr.Length < 3)
            {
                basePath = projrctStr[0];
                activingFile = projrctStr[1];
            }
            if (projrctStr.Length < 4)
            {
                selectedTest = projrctStr[2];
            }
            string message = string.Format("----工程名----\r\n{0}\r\n----激活文件----\r\n{1}\r\n----已选文本----\r\n{2}\r\n----程序头部----\r\n{3}\r\n----函数----\r\n{4}\r\n----程序结尾----\r\n",
                              basePath,
                              activingFile,
                              selectedTest,
                              funcMessage.Head.Replace(" ", ""),
                              funcMessage.Body.Replace(" ", ""),
                              funcMessage.Foot.Replace(" ", ""));
            GlobalVariables.functionString = message;

        }
        public string ReturnResult()
        {
            return GlobalVariables.functionString;
        }
    }

类需要继承MarshalByRefObject用于Appdomain边界引用

外接程序

  if (_applicationObject != null)
            {
                string projectmess = _applicationObject.ActiveWindow.Project.FullName + '$'                          //项目名称
                                     + _applicationObject.ActiveDocument.FullName.Trim() + "$"                        //文件
                                     + ((TextSelection)_applicationObject.ActiveDocument.Selection).Text.Trim();     //被选文本

                string appPath = @"C:\Users\Administrator\Desktop\work";
                string assemblyPath = @"D:\我的文档\Visual Studio 2012\Projects\FuncTest\FuncTest\bin\Debug\AddFunc.dll";


                FuncMessage funcMessage = new FuncMessage();
                funcMessage.ProjectMessage = projectmess;
                funcMessage.Head = this.HeaderText.Text.Trim();
                funcMessage.Body = this.BodyText.Text.Trim();
                funcMessage.Foot = this.FootText.Text.Trim();

                AppDomainSetup setup = new AppDomainSetup();
                setup.ApplicationName = "ModelLoad";
                setup.ApplicationBase = appPath;// AppDomain.CurrentDomain.BaseDirectory;
                setup.PrivateBinPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "private");
                setup.CachePath = setup.ApplicationBase;
                setup.ShadowCopyFiles = "true";
                setup.ShadowCopyDirectories = setup.ApplicationBase;
                appDomain = AppDomain.CreateDomain("ModelLoadDomain", null, setup);
                string name = Assembly.LoadFrom(assemblyPath).GetName().FullName;

                IFunc = (FuncProcessings)appDomain.CreateInstanceAndUnwrap(
                name,
                typeof(Processing).FullName);

                IFunc.GetFunctionMessage(funcMessage);
                ResultForm rf = new ResultForm(IFunc.ReturnResult());
                rf.ShowDialog();
                }

外接程序和应用程序有所区别,外接程序的工作目录并非是当前的工作目录,尽管编辑器不会报错但是运行时会报错,所以引用的结构和dll需要放到安装目录下common7下的ide内,这里放置processing的基类更加合适,用于创建实例,事实上这里需要只是类型,实现是在跨边界引用的对象里。

 setup.ApplicationBase = appPath;// AppDomain.CurrentDomain.BaseDirectory;

正常的程序是使用注释后的路径即可在debug下创建新域的目录,由于外接程序的特殊性,此处获取的并非是真正需要的目录,所以我在这里指定绝对路径,然而将这个路径指定为处理程序的debug目录也当是个不错的主意。

测试结果

取消注释,生成。vs并未重启。

ok,基本思想就是这样子了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小古哥的博客园

HTML5复习整理

一、推出的目标 web浏览器兼容性低;文档结构不明确;web应用程序的功能受限 二、语法的改变 内容类型(html或htm);DOCTYPE声明简化;指定字符编...

3667
来自专栏HTML5学堂

2016.07 第2周 群问题分享

HTML+CSS 移动端中1px的边框如何实现 2016.07.04~2016.07.08 核心概念: viewport、CSS3属性 参考答案: 一、通过设置...

2926
来自专栏一“技”之长

Java开发GUI之列表 原

    awt包中的List控件可以创建一个选择列表,此列表可以支持单选,也可以支持多选。

2462
来自专栏lonelydawn的前端猿区

一款轻量级树形控件EasyTreeview

使用方法 引入 <link rel="stylesheet" type="text/css" href="./css/index.min.css"> <div ...

3979
来自专栏python爬虫实战之路

python操作Excel,你觉得哪个库更好呢?

每一个Excel数据文件从上至下分为三个层级的对象: workbook: 每一个Excel文件就是一个workbook。 sheet: 每一个workbook中...

4K3
来自专栏PHP在线

jQuery学习笔记

jQuery大部分功能需要根据文档的DOM模型来工作,首先需要正确地解析到整个文档的DOM模型结构。使用jQuery需要在整个文档被浏览器完全加载后才开始进行。

1022
来自专栏GIS讲堂

Arcgis for Js实现graphiclayer的空间查询(续)

上文中,实现了简单的针对graphiclayer的空间查询工作,在本节,将更加详细的介绍针对graphiclayer的空间查询。首先,空间查询的方式:提供多种类...

923
来自专栏别先生

jQuery/javascript实现网页注册的表单验证

1 <html> 2 <head> 3 <meta charset="utf-8"> 4 <title>注册表单验证</title> 5 <...

2356
来自专栏iKcamp

React 深入系列3:Props 和 State

文:徐超,《React进阶之路》作者 授权发布,转载请注明作者及出处 ---- React 深入系列3:Props 和 State React 深...

3826
来自专栏進无尽的文章

编码篇-OC跨多层UI事件传递处理

在 iOS 中,对象间的交互模式大概有这几种:直接 property 传值、delegate、KVO、block、protocol、多态、Target-Acti...

1423

扫码关注云+社区