実行時にテキストを動的オブジェクトにコンパイルするときに問題があります。C#アセンブリを動的にロードする
私はテキストをコンパイルしたコードのシンプルな作品を書いた:
public class CompileFactory
{
public dynamic Compile(String classCode, String mainClass, Object[] requiredAssemblies)
{
CSharpCodeProvider provider = new CSharpCodeProvider(new Dictionary<string, string>
{
{ "CompilerVersion", "v4.0" }
});
CompilerParameters parameters = new CompilerParameters
{
GenerateExecutable = true, // Create a dll
GenerateInMemory = true, // Create it in memory
WarningLevel = 3, // Default warning level
CompilerOptions = "/optimize", // Optimize code
TreatWarningsAsErrors = false // Better be false to avoid break in warnings
};
// Add all extra assemblies required
foreach (var extraAsm in requiredAssemblies)
{
parameters.ReferencedAssemblies.Add(extraAsm as string);
}
CompilerResults results = provider.CompileAssemblyFromSource(parameters, classCode);
if (results.Errors.Count != 0)
{
return "FAILED";
}
return results.CompiledAssembly.CreateInstance(mainClass); ;
}
}
これは私がCompile
メソッドを使用しています方法です。
List<string> assemblies = new List<string>{"System.Net.Mail.dll", "System.Net.dll"};
dynamic obj = compile.Compile(fileText, pluginName, assemblies.ToArray());
ご覧のとおり、ある時点で追加のアセンブリへの参照を追加しています。何らかの理由でusing System.Net;
をテキストファイルに追加すると、参照されずエラーが発生します。私がコンパイルしているテキストは、文字通りテキストとして保存された.csファイルです。私はusing *
を抽出して別々に追加することでこの問題を回避することを考えましたが、System.Net.Mail.dll
を追加するとメタデータファイルが見つかりませんでした。
似たような経験がありますか?私は本当にファイルにusing *
を追加して準備をしています。 入力があれば幸いです。
「コンパイル」の呼び出し方法を表示できますか?あなたが渡した引数を見たいのですが、 –
@PhilippeParé 'dynamic obj = compile.Compile(fileText、pluginName、assemblies.ToArray());'アセンブリーは 'List {" System.Net.Mail.dll " 、 "System.Net.dll"}; ' –
あなたの問題に非常に関連しているので、あなたの投稿にこれを追加する必要があります。私の答えは –