Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用AppDomain在DLL中实例化类_C#_Asp.net_Assemblies_Appdomain_Createinstance - Fatal编程技术网

C# 使用AppDomain在DLL中实例化类

C# 使用AppDomain在DLL中实例化类,c#,asp.net,assemblies,appdomain,createinstance,C#,Asp.net,Assemblies,Appdomain,Createinstance,我有一个网站,可以根据用户需求动态编译一个类,并将dll(名为Equation.dll)存放在网站的子目录中。管理员可以随时重新编译。但是,一旦创建了类的实例,就会显示消息“该进程无法访问该文件,因为它正被另一个进程使用” 据我所知,解决这个问题的唯一方法是从不同的AppDomain创建实例。下次管理员需要重新编译时,我需要卸载这个AppDomain,并且(我认为)一切都会好起来。(也许我的假设是错误的?) 坦白地说,我不能创建这个类的实例来拯救我的生命。不可否认,我在这里有点不知所措……所以我

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


还是我完全偏离了这一目标?非常沮丧。任何帮助都将不胜感激。

您看到的是.NET试图绑定您的调用DLL(Cnn.CostModel.DLL)。我猜Equation.dll引用了主dll中的某些类型,这就是为什么您正在创建的AppDomain会尝试加载它。

我对AppDomains本身不太了解,但您的基本问题听起来非常像是创建用来解决的问题。我不确定它是否能满足您的具体要求,但格伦·布洛克对的评论似乎表明它能满足您的具体要求。如果您对当前的体系结构不太熟悉,或许值得一看。

您错过了一项工作。 您已经创建了新的appdomain,但在实例化其中的类之前,必须将该类所在的程序集加载到新的appdomain中,然后才能尝试从中创建实例

从示例的外观来看,等式是需要加载的程序集的名称,要创建的类的名称是什么

Rick Strahl提供了一些关于如何完成所有这些的好信息,这也是我从中学到的: