2017-01-23 5 views
0

CSharpCodeProviderを使用してコードを動的にコンパイルしようとしています。参照されているアセンブリでは、hereのように、typeof(Program).Assembly.CodeBaseの参照パラメータを追加していますが、動作しません。 、そうでない場合はエラーメッセージからファイル名を唯一の違いは、ファイルの拡張子は、ファイルエクスプローラ(「.dllファイル」)で小文字を示したということですが、 - 私はまだその名前のファイルが存在しないCSharpCodeProvider現在のアセンブリを参照する方法

error CS0006: Metadata file 'file:///C:/Code/MyProject/bin/MyProject.DLL' could not be found; 

を言ってエラーが出ます私が参照したいdllの名前とパスに一致します。

この場合、コンパイラが参照されたdllを見逃すのはなぜですか?ここ
は、私のコードの該当部分である:

 CompilerResults result = null; 
     CompilerParameters parms = new CompilerParameters(); 
     parms.GenerateExecutable = false; 
     parms.GenerateInMemory = true; 
     parms.OutputAssembly = "MyOutputAssembly"; 
     parms.ReferencedAssemblies.Add("System.dll"); 
     parms.ReferencedAssemblies.Add("System.Data.dll"); 
     parms.ReferencedAssemblies.Add("mscorlib.dll"); 
     parms.ReferencedAssemblies.Add(typeof(Program).Assembly.CodeBase); // Reference the current assembly 

     // Lock because CSharpCodeProvider can only compile the code once per time slot 
     lock (lockCompile) 
     { 
      using (CSharpCodeProvider codeProvider = new CSharpCodeProvider()) 
      { 
       result = codeProvider.CompileAssemblyFromSource(parms, new string[] { code.ToString() }); 
      } 
     } 
+0

'.CodeBase'の代わりに' typeof(Program).Assembly.Location'を使ってみてください。アセンブリの '.Location'プロパティはまっすぐなパスを返しますが、' .CodeBase'はURI形式の位置を返します。私は確信していませんが、 '.Location'は何も与えず、' .CodeBase'が与えることができる、リモートでホストされたコードをロードすることに関するシナリオがあるかもしれないと思います。 'http' URIですが、あなたのシナリオでは、アセンブリが常にローカルになるように聞こえるので、常に有効な' .Location'値を持つべきです。 :-) –

+0

完了し、ありがとう:-) –

+0

ありがとう!それはうまくいきました。答えとして追加すると、.CodeBaseとは非常に異なるパスを取得しました.CodeBaseはbinフォルダの場所を取得し、Locationは一時ディレクトリを取得しました。C:\\ Windows \\ Microsoft.NET \\ Framework64 \\ v4.0.30319 \\ Temporary ASP.NET Files \\ myIISDirName \\ 65307448 \\ ec575f43 \\アセンブリ\\ dl3 \\ d46288d9 \\ 3e71eb5a_c275d201 \\ MyProject.dll。この記事(http://stackoverflow.com/questions/864484/getting-the-path-of-the-current-assembly)は、.Locationがシャドーコピーの前にアドレスを取得し、私を少し混乱させることを示唆しているようです場所が安全である場合... – user756366

答えて

1

typeof(Program).Assembly.Location代わりの.CodeBaseを使用してみてください。アセンブリの.Locationプロパティは、ロードされる実際のファイルへのまっすぐなパスを返しますが、.CodeBaseは、URI形式の正規の場所を返します。私は確信していませんが、.Locationは何も与えず、.CodeBaseが与えるかもしれない遠隔ホストコードの読み込みに関連するシナリオがあると思います。 http URIですが、シナリオではアセンブリが常にローカルになるように聞こえるので、常に有効な.Locationの値を設定する必要があります。 :-)

+0

最後に、新しいSystem.Uri(Assembly.GetExecutingAssembly()。EscapedCodeBase)を使用しています.LastPathは、http://stackoverflow.com/questions/864484/getting-現在のアセンブリのパス、いずれにせよ、上記の "マークされた"答えも働いて、そこにいました! – user756366

関連する問題