使用AppDomain实例化DLL中的类

时间:2009-03-27 00:12:06

标签: c# asp.net assemblies appdomain createinstance

我有一个网站,根据用户需求动态编译一个类,并将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”文件?

或者我完全不依赖于这项努力?非常沮丧。任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:1)

我对AppDomains本身并不了解,但您的基本问题听起来非常像MEF创建的问题。我不确定它是否能满足您的具体要求,但Glenn Block对this post的评论似乎表明它会。如果你的当前架构不是太远,也许值得一看。

答案 1 :(得分:0)

你看到的是.NET试图绑定你的调用DLL(Cnn.CostModel.dll)。我猜测Equation.dll引用了你的主dll中的某些类型,这就是你创建的AppDomain试图加载它的原因。

答案 2 :(得分:0)

你错过了一件作品。 您已经创建了新的appdomain,但在您可以在那里实例化类之前,您必须将类所在的程序集加载到新的AppDomain中,然后您可以尝试从中创建一个实例。

从样本的外观来看,Equation是您需要加载的程序集的名称,您要创建的类的名称是什么?

Rick Strahl有一些关于如何做到这一点的好信息,这是我从中学到的:

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