「CSharpCodeProvider」を使用して C# コードを動的に実行し、コードをコンパイルしてメソッドを呼び出します。その DLL からクラスを呼び出すには、特定の DLL ファイルをコンパイラに含める必要があります。私は方法を使用しています:
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add(the path of the DLL File);
しかし、メソッドを呼び出すと、エラーが発生します:
Could not load file or assembly or one of its dependencies. The system cannot find the file specified.
しかし、 Project>References>Add Reference から DLL をインクルードすると、コードが呼び出されてエラーが発生しました。そのエラーを回避するために、実行時に参照を動的に追加する方法を誰か教えてもらえますか?
コードは次のとおりです。
CSharpCodeProvider Code = new CSharpCodeProvider();
ICodeCompiler icc = Code.CreateCompiler();
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.ReferencedAssemblies.Add("system.data.dll");
cp.ReferencedAssemblies.Add("system.windows.forms.dll");
cp.ReferencedAssemblies.Add(@"D:\AnalogClockControl.dll");
cp.CompilerOptions = "/t:library";
cp.GenerateInMemory = true;
StringBuilder sb = new StringBuilder("");
sb.Append("using System;\n");
sb.Append("using System.Data;\n");
sb.Append("using System.Windows.Forms;\n");
sb.Append("namespace CSCodeEvaler{ \n");
sb.Append("public class CSCodeEvaler{ \n");
sb.Append("public void test(){AnalogClockControl.AnalogClock _AnalogClock= new AnalogClockControl.AnalogClock();}\n");
sb.Append("} \n");
sb.Append("}\n");
CompilerResults cr = icc.CompileAssemblyFromSource(cp, sb.ToString());
if (cr.Errors.Count > 0)
{
return ; //"ERROR: " + cr.Errors[0].ErrorText
}
System.Reflection.Assembly a = cr.CompiledAssembly;
object o = a.CreateInstance("CSCodeEvaler.CSCodeEvaler");
Type t = o.GetType();
MethodInfo mi = t.GetMethod("test");
object j = mi.Invoke(o, new object[] {}); // Here where I get the exception