У меня есть веб-сайт, который по требованию пользователя на лету компилирует класс и помещает dll (с именем Equation.dll) в подкаталог веб-сайта. Администратор может перекомпилировать в любое время. Однако после создания экземпляра класса появляется сообщение «Процесс не может получить доступ к файлу, поскольку он используется другим процессом».
Насколько я понимаю, единственный способ обойти это - создать экземпляры из другого домена приложений. В следующий раз, когда администратору потребуется перекомпилировать, мне нужно будет выгрузить этот домен приложений, и (я думаю) все будет хорошо. (Возможно, мое предположение неверно?)
Честно говоря, я не могу создать экземпляр этого класса, чтобы спасти мою жизнь. По общему признанию, я немного над головой здесь ... таким образом, я качаюсь во всем. Мой фрагмент на данный момент:
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 (хотя я попытался поместить ее в «мусорную корзину» для удовольствия, но также безуспешно). Имя сборки в вызове кажется правильным (и оно работает с 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.
Я не понимаю, почему он ищет разные формы "Cnn.CostModel" в каталоге "уравнение кэша". Следует признать, что вызывающий код находится в папке «Cnn.CostModel.dll» в папке bin. Что мне нужно сделать, чтобы вместо этого получить файл "Equation.dll"?
Или я просто совершенно не согласен с этим делом? Очень расстроен. Любая помощь будет принята с благодарностью.