none
載入Assembly ,如何不被主程式鎖住 RRS feed

  • 問題

  •         Assembly asmb =null;
            IXXObj obj = null;
            
            asmb = Assembly.LoadFrom("Some.dll");                           
            obj = (IXXObj)asmb.CreateInstance("InstanceName");
            當我載入檔案時 ,可以成功,
            obj =null;   asmb = null;  
            檔案會被鎖住,無法更新
    有什麼方式不讓檔案Some.dll 被主程式鎖住
    導致無法更新等問題




    2010年1月6日 下午 04:19

解答

所有回覆

  • 執行中、已載入的都會被鎖住,所以用另一個程式把這支程式結束掉更新...

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年1月6日 下午 04:36
  • Hi,

    試試這篇提的方法

    Read the assembly into memory:

    byte[] assemblyBytes = File.ReadAllBytes(@"AssemblyLocation.dll"); 

    Load the assembly from an array of bytes:

    Assembly assembly = Assembly.Load(assemblyBytes); 


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 HikaruGo 2010年1月6日 下午 04:57
    2010年1月6日 下午 04:42
  • 這個問題在.Net的正確做法是採用AppDomain來切割,底下為我程式中一個類似你需求用來載入及釋放assembly的做法.
    另外AppDomain其實可以做到的東西非常多,像是Ghost映射(ASP.Net採用的做法),底下範例並未包含這些,有興趣上Google搜尋AppDomain關鍵字,會有很多資料.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace My.Scheduling
    {
        class JobLoaderCreator
        {
            private AppDomain _appDomain;
            private string _pluginFolderName;
            private string _jobFolderName;
            private string _assemblyString;
    
            public JobLoaderCreator(string jobFolderName, string pluginFolderName, string assemblyString)
            {
                this._jobFolderName = jobFolderName;
                this._pluginFolderName = pluginFolderName;
                this._assemblyString = assemblyString;
            }
    
            public JobLoader CreateJobLoader()
            {
                CreateAppDomain();
    
                Type type = typeof(JobLoader);
                return (JobLoader)this._appDomain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
            }
    
            public void Unload()
            {
                if (this._appDomain != null)
                {
                    AppDomain.Unload(this._appDomain);
                }
            }
    
            private void CreateAppDomain()
            {           
                AppDomainSetup setup = new AppDomainSetup();            
                setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
                setup.PrivateBinPath = this._pluginFolderName + "\\" + this._jobFolderName;
                setup.ConfigurationFile =
                    AppDomain.CurrentDomain.BaseDirectory + "\\" +
                    this._pluginFolderName + "\\" +
                    this._jobFolderName + "\\" +
                    this._assemblyString + ".dll.config";
    
                this._appDomain = AppDomain.CreateDomain(this._jobFolderName, null, setup);            
            }
        }
    }
    
    2010年1月7日 上午 12:00