結構圖c#
生成目錄和新的appdomain基目錄相同,隨時生成,隨時加載。app
接口代碼dom
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序列化特性,用於數據傳輸編輯器
處理邏輯ide
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的基類更加合適,用於建立實例,事實上這裏須要只是類型,實現是在跨邊界引用的對象裏。this
setup.ApplicationBase = appPath;// AppDomain.CurrentDomain.BaseDirectory;
正常的程序是使用註釋後的路徑便可在debug下建立新域的目錄,因爲外接程序的特殊性,此處獲取的並不是是真正須要的目錄,因此我在這裏指定絕對路徑,然而將這個路徑指定爲處理程序的debug目錄也當是個不錯的主意。spa
測試結果debug
取消註釋,生成。vs並未重啓。
ok,基本思想就是這樣子了。