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