私は、ユーザーの要求に応じてオンザフライでクラスをコンパイルし、Web サイトのサブディレクトリに dll (Equation.dll という名前) を配置する Web サイトを持っています。管理者はいつでも再コンパイルできます。ただし、クラスのインスタンスが作成されると、「別のプロセスによって使用されているため、プロセスはファイルにアクセスできません」というメッセージが表示されます。
私が理解しているように、これを回避する唯一の方法は、別の 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」ファイルを取得するにはどうすればよいですか?
それとも、私はこの努力に完全に基づいていませんか? 非常にイライラします。どんな助けでも大歓迎です。