2009-04-27 11 views
9

CodeDomProviderクラスを使用して、実行時にクラスをコンパイルしています。私もSystem.Web.UI.WebControlsを使用してクラスをコンパイルしようとすると、私はこのエラーを取得するCompilerParameters.ReferencedAssemblies - System.Web.UI.WebControlsへの参照を追加します。

using System; 

public class Test 
{ 
    public String HelloWorld() 
    { 
     return "Hello World!"; 
    } 
} 

{error CS0006: Metadata file 'System.Web.UI.WebControls' could not be found} System.CodeDom.Compiler.CompilerError

は、ここに私のコードの抜粋です:

これは System名前空間を使用して、クラスのために正常に動作します
var cp = new CompilerParameters(); 

cp.ReferencedAssemblies.Add("System.Web.UI.WebControls"); 

System.Web.UI.WebControls名前空間の参照方法を教えてください。

答えて

14

名前空間ではなくアセンブリを参照します。この場合にはために起こっている:あなたが使用する必要があるクラスを含むアセンブリの名前をルックアップするためにMSDNを使用する必要があります

var cp = new CompilerParameters(); 
cp.ReferencedAssemblies.Add("System.Web.dll"); 
+0

私のためには機能しません。あなたは私がアセンブリへの完全な道を提供すべきだと思いますか?そうであれば;どのように私はそれを動的に行うことができますか? – roosteronacid

+3

Ah、System.Web.UI.WebControls.dllは存在しません。その名前空間のクラスはSystem.Web.dllに代りに存在します。 –

39

することはでき現在ロードされているすべてのアセンブリをループ:

var assemblies = AppDomain.CurrentDomain 
          .GetAssemblies() 
          .Where(a => !a.IsDynamic) 
          .Select(a => a.Location); 

cp.ReferencedAssemblies.AddRange(assemblies.ToArray()); 
+0

なぜ.Where(a =>!a.IsDynamic)のときにtry/catchをキャッチするのですか? – epitka

+0

私の元の答えは、私がコードを書いた時に使っていた.net 2.0で働いていました。 LINQもAssembly.IsDynamicプロパティも.net 2.0に存在しません。 –

+3

AddRangeはAddではありません(修正しますが、<6 charを編集できません)。 – phillipwei

5

これは私の場合には少し軽い力であることが判明しました。私はaddinを構築していたので、現在のドメインに730個のアセンブリがロードされていたので、大きな遅延があった。

var assemblies = someType.Assembly.GetReferencedAssemblies().ToList(); 
    var assemblyLocations = 
assemblies.Select(a => 
    Assembly.ReflectionOnlyLoad(a.FullName).Location).ToList(); 

assemblyLocations.Add(someType.Assembly.Location); 

cp.ReferencedAssemblies.AddRange(assemblyLocations.ToArray()); 
+1

+1。私はあなたの提案を使用し、素晴らしい仕事をした。最後の行を編集し、代わりに 'cp.ReferencedAssemblies.AddRange(assemblyLocations.ToArray());'と書かなければなりません。 –

関連する問題