0

私は、ユーザーの要求に応じてオンザフライでクラスをコンパイルし、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」ファイルを取得するにはどうすればよいですか?

それとも、私はこの努力に完全に基づいていませんか? 非常にイライラします。どんな助けでも大歓迎です。

4

3 に答える 3

1

AppDomains自体についてはよくわかりませんが、基本的な問題はMEFが解決するために作成した問題と非常によく似ています。それがあなたの特定の要件に対応するかどうかはわかりませんでしたが、この投稿に対するグレン・ブロックのコメントは、それが対応することを示しているようです。現在のアーキテクチャをそれほど遠くない場合は、一見の価値があります。

于 2009-03-27T00:46:30.090 に答える
0

表示されているのは、呼び出し元のDLL(Cnn.CostModel.dll)をバインドしようとしている.NETです。Equation.dllがメインdllのタイプを参照していると推測しているため、作成しているAppDomainがそれを読み込もうとします。

于 2009-03-27T00:35:45.547 に答える
0

あなたは作品を見逃しています。新しい appdomain を作成しましたが、そこでクラスをインスタンス化する前に、クラスが存在するアセンブリを新しい AppDomain に読み込む必要があります。その後、そこからインスタンスを作成することができます。

サンプルの外観から、Equation はロードする必要があるアセンブリの名前です。作成するクラスの名前は何ですか?

Rick Strahl は、これらすべてを行う方法についていくつかの良い情報を持っています。私はそこから学びました:

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

于 2010-03-26T17:27:43.700 に答える