我有一个网站,根据用户需求动态编译一个类,并将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");
“equationcache”文件夹是编译dll的地方(虽然我已经尝试将其放在“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”文件?
或者我完全不依赖于这项努力?非常沮丧。任何帮助都会非常感激。
答案 0 :(得分:1)
我对AppDomains本身并不了解,但您的基本问题听起来非常像MEF创建的问题。我不确定它是否能满足您的具体要求,但Glenn Block对this post的评论似乎表明它会。如果你的当前架构不是太远,也许值得一看。
答案 1 :(得分:0)
你看到的是.NET试图绑定你的调用DLL(Cnn.CostModel.dll)。我猜测Equation.dll引用了你的主dll中的某些类型,这就是你创建的AppDomain试图加载它的原因。
答案 2 :(得分:0)
从样本的外观来看,Equation是您需要加载的程序集的名称,您要创建的类的名称是什么?
Rick Strahl有一些关于如何做到这一点的好信息,这是我从中学到的: