簡體   English   中英

使用AppDomain實例化DLL中的類

[英]Using an AppDomain to instantiate a class in a DLL

我有一個網站,可以根據用戶需求即時編譯一個類,並將dll(名為Equation.dll)存放在該網站的子目錄中。 管理員可以隨時重新編譯。 但是,一旦創建了該類的實例,就會顯示消息“該進程無法訪問文件,因為該文件正在被另一個進程使用”。

據我了解,解決此問題的唯一方法是從其他AppDomain創建實例。 下次管理員需要重新編譯時,我將需要卸載此AppDomain,並且(我認為)一切都會好起來。 (也許我的假設是錯誤的?)

坦白說,我無法創建此類的實例來挽救生命。 誠然,我在這里有點煩惱...所以我在搖擺。 此時,我的片段是:

AppDomainSetup ads = new AppDomainSetup();
ads.PrivateBinPath = HttpContext.Current.Server.MapPath("~/equationcache/");
ads.ApplicationBase = HttpContext.Current.Server.MapPath("~/equationcache/");
AppDomain appDomain = AppDomain.CreateDomain("EquationDomain", null, ads);

Object wrapper = appDomain.CreateInstance("Equation, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "Cnn.CostModel.Business.CalculationEngine");

dll被編譯到的“ equationcache”文件夾中(盡管我嘗試將其放置在“ bin”中是為了娛樂,但也沒有成功)。 調用中的程序集名稱似乎正確(並且與appDomain.Load一起使用)。 呼叫中的類型名稱似乎正確。 根據日志,將發生以下情況:

=== Pre-bind state information ===
LOG: User = xxx\xxx
LOG: DisplayName = Cnn.CostModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/Users/xxx/Documents/Visual Studio     2008/Projects/CnnCostModel/CnnCostModels/equationcache/
LOG: Initial PrivatePath = C:\Users\xxx\Documents\Visual Studio 2008\Projects\ACnnCostModel\CnnCostModels\equationcache\Calling assembly : Equation, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null.
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Users/xxx/Documents/Visual Studio 2008/Projects/CnnCostModel/CnnCostModels/equationcache/Cnn.CostModel.DLL.
LOG: Attempting download of new URL file:///C:/Users/xxx/Documents/Visual Studio 2008/Projects/CnnCostModel/CnnCostModels/equationcache/Cnn.CostModel/Apa.CostModel.DLL.
LOG: Attempting download of new URL file:///C:/Users/xxx/Documents/Visual Studio 2008/Projects/CnnCostModel/CnnCostModels/equationcache/Cnn.CostModel.EXE.
LOG: Attempting download of new URL file:///C:/Users/xxx/Documents/Visual Studio 2008/Projects/CnnCostModel/CnnCostModels/equationcache/Cnn.CostModel/Cnn.CostModel.EXE.

我不明白為什么它要在“ equationcache”目錄中查找不同形式的“ Cnn.CostModel”。 可以肯定,調用代碼位於bin文件夾中的“ Cnn.CostModel.dll”中。 我需要做什么來代替獲取“ Equation.dll”文件?

還是我只是完全不這樣做呢? 很沮喪。 任何幫助將不勝感激。

我對AppDomains本身了解不多,但是您的基本問題聽起來很像MEF旨在解決的問題。 我不確定它是否可以滿足您的特定要求,但是Glenn Block對這篇文章的評論似乎表明它可以解決。 如果您當前的體系結構還不太遠,也許值得一看。

您缺少一件工作。 您已經創建了新的appdomain,但是在此處實例化類之前,必須將類所在的程序集加載到新的AppDomain中,然后才能嘗試從中創建實例。

從樣本的外觀來看,方程式是您需要加載的程序集的名稱,您要創建的類的名稱是什么?

瑞克·斯特拉爾(Rick Strahl)提供了一些有關如何執行所有操作的良好信息,這是我從以下課程中學到的:

http://www.west-wind.com/WebLog/posts/601200.aspx

您將看到.NET試圖綁定您的調用DLL(Cnn.CostModel.dll)。 我猜想Equation.dll在您的主dll中引用了某種類型,這就是您創建的AppDomain嘗試加載它的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM