2009-03-27 35 views
0

私は、ユーザーの要求に応じてクラスをコンパイルし、dll(Equation.dllという名前)をWebサイトのサブディレクトリに配置します。管理者はいつでも再コンパイルできます。ただし、クラスのインスタンスが作成されると、「別のプロセスによって使用されているため、プロセスはファイルにアクセスできません」というメッセージが表示されます。AppDomainを使用してDLL内のクラスをインスタンス化する

私が理解しているように、これを回避するには、別のAppDomainからインスタンスを作成するしかありません。次回管理者が再コンパイルする必要があるときは、このAppDomainをアンロードする必要があります。 (おそらく私の仮定は間違っていますか?)

私の人生を救うために、このクラスのインスタンスを作成することはできません。確かに、私はここに私の頭の上に少しだ...だから私は何にでもスイングしている。この時点で私の抜粋です: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"); 

「equationcache」フォルダがあります。呼び出し中のアセンブリ名が正しいように見えます(appDomain.Loadで動作します)。呼び出しの型名が正しいように見えます。ログによると、次の処理が行われます。私はそれが「equationcache」ディレクトリ内の「Cnn.CostModel」の異なる形を探している理由を理解していない

=== 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. 

。確かに、呼び出しコードはbinフォルダの "Cnn.CostModel.dll"にあります。代わりに "Equation.dll"ファイルを取得するために何をする必要がありますか?

また、私はこの努力の根底にありますか?非常に不満。どんな助けでも大いに感謝します。

答えて

0

.NETが呼び出し元のDLL(Cnn.CostModel.dll)をバインドしようとしています。私は、Equation.dllがあなたのメインdllのいくつかのタイプを参照していると推測しているので、作成しているAppDomainがそれをロードしようとしています。

1

私はAppDomains自体についてはあまりよく分かりませんが、あなたの根本的な問題は、解決するためにMEFが作成されたものと非常によく似ています。私はそれがあなたの特定の要求に対処するかどうかはわかりませんでしたが、Glenn Blockのコメントthis postへのコメントは、それがそうであると思われるようです。おそらく、あなたの現在のアーキテクチャーで道を遠く離れすぎていないかどうかは一見の価値があります。

+0

私はMEFに見てみましょう...ありがとう:

リックシュトラールは、すべてこれを行う方法のいくつかの良い情報を持っている、その私が学んだからどこ! –

0

あなたは作品を欠いています。 新しいappdomainを作成しましたが、そこでクラスをインスタンス化する前に、クラスが属するアセンブリを新しいAppDomainにロードしてからインスタンスを作成する必要があります。

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

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

関連する問題