2

CodeCompileUnitをビルドすると、次のコードでC#ソースコードファイル、.dllが出力され、アセンブリからインスタンスを取得できます。

TextWriter tw = new IndentedTextWriter(new StreamWriter(filePath + ".cs", false), "    ");
provider.GenerateCodeFromCompileUnit(compileUnit, tw, new CodeGeneratorOptions());
tw.Close();

CompilerParameters cp = new CompilerParameters { GenerateInMemory = true, GenerateExecutable = false};
cp.ReferencedAssemblies.Add("MyProgram.exe");
cp.OutputAssembly = filePath + ".dll";
CompilerResults cr = provider.CompileAssemblyFromFile(cp, filePath + ".cs");

MyType instance = (MyType)Activator.CreateInstance(cr.CompiledAssembly.GetTypes()[0]);

ここまでは順調ですね。今、私はそれらのファイルを生成することを避けたいと思います:

CompilerParameters cp = new CompilerParameters { GenerateInMemory = true, GenerateExecutable = false};
cp.ReferencedAssemblies.Add("MyProgram.exe");
//cp.OutputAssembly = filePath + ".dll";
CompileResults cr = provider.CompileAssemblyFromDom(cp, compileUnit);

これにより、FileNotFoundExceptionがスローされます。\ tempフォルダでx32savit.dll(または同様のもの)を探しますが、そこにはありません。OutputAssemblyのコメントを外すと、同じように失敗しますが、そのパス上にあります。

4

1 に答える 1

4

名前空間のエラーであることが判明しました。ここに良い例があります。

次のコードを追加すると、デバッグ時に非常に役立ちました。

  string errorText = String.Empty;
  foreach (CompilerError compilerError in compilerResults.Errors)
      errorText += compilerError + "\n";
于 2012-06-28T23:45:50.990 に答える