런타임에 텍스트를 동적 개체로 컴파일 할 때 문제가 있습니다. 나는 Compile
방법을 사용하고 어떻게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); ;
}
}
이것은 :
나는 텍스트를 컴파일하는 코드의 간단한 조각을 썼다.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é'동적 obj = compile.Compile (파일 텍스트, pluginName, assemblies.ToArray()); '어셈블리는 단지 목록입니다. { "System.Net.Mail.dll" , "System.Net.dll"}; ' –
귀하의 문제와 관련성이 높기 때문에이를 게시물에 추가해야합니다. 내 답변은 –