Использование AppDomain для создания экземпляра класса в DLL - PullRequest
0 голосов
/ 27 марта 2009

У меня есть веб-сайт, который по требованию пользователя на лету компилирует класс и помещает 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"?

Или я просто совершенно не согласен с этим делом? Очень расстроен. Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 27 марта 2009

Сам по себе я не знаю много о AppDomains, но ваша фундаментальная проблема очень похожа на ту, которую MEF был создан для решения. Я не был уверен, будет ли это соответствовать вашим конкретным требованиям, но комментарий Гленна Блока к этой записи , похоже, будет указывать, что это так. Возможно, стоит взглянуть, если вы не слишком далеко в будущем с вашей текущей архитектурой.

0 голосов
/ 26 марта 2010

вам не хватает части работы. Вы создали новый домен приложения, но прежде чем создавать экземпляр класса, вам необходимо загрузить сборку, в которой находится этот класс, в ваш новый домен приложения, а затем попытаться создать экземпляр из него.

Судя по вашему образцу, Equation - это имя сборки, которую нужно загрузить, как называется класс, который вы хотите создать?

У Рика Строла есть хорошая информация о том, как все это сделать, откуда я узнал:

http://www.west -wind.com / WebLog / сообщений / 601200.aspx

0 голосов
/ 27 марта 2009

Вы видите, что .NET пытается связать вашу вызывающую DLL (Cnn.CostModel.dll). Я предполагаю, что Equation.dll ссылается на некоторый тип в вашей основной dll, и именно поэтому создаваемый вами AppDomain пытается его загрузить.

...