큰 문자열 const를 가진 클래스를 생성해야하는 상황이 있습니다. 내 제어 밖에있는 코드는 생성 된 CodeDom 트리를 C# 소스로 내보내고 나중에 더 큰 어셈블리의 일부로 컴파일합니다.csc.exe에서 스택 오버플로 (CS1647)가 발생하는 C# CodeDom의 해결 방법은 무엇입니까?
fatal error CS1647: An expression is too long or complex to compile near 'int'
MSDN :
불행하게도,이 문자열의 길이가 Win2K8의 64에서 335,440 문자 (Win2K3 86에서 926240), 치명적인 오류와 C# 컴파일러 종료를 초과된다 경우 상황으로 실행했습니다 CS1647은 "컴파일러에서의 스택 오버플로"라고합니다. 더 자세히 살펴보면 CodeDom이 80 자의 문자열 const를 "멋지게"감싸는 것을 확인했습니다. 이로 인해 컴파일러는 x64 NetFx의 C# 컴파일러의 스택 깊이 인 4193 개의 문자열 청크를 연결합니다. CSC.exe는이 표현식을 내부적으로 재귀 적으로 평가하여 내 단일 문자열을 "rehydrate"해야합니다. "외부 시스템에서 C# 소스를 중간 단계로 사용한다는 사실을 제어 할 수 없으며이 코드를 사용하여 코드 생성기가 문자열을 내보내는 방식을 변경할 수 있습니까?"내 초기 질문은 "입니다. (문자열의 런타임 연결이 아니라) 상수가되도록합니다.
또는 는 어떻게이 표현은 문자의 특정 숫자 후, 난 여전히 상수를 만들 수 있어요하도록 공식화 할 수 있지만 덩어리 큰 여러 로 구성되어있다?
전체 생식가 여기에 있습니다 :
// this string breaks CSC: 335440 is Win2K8 x64 max, 926240 is Win2K3 x86 max
string HugeString = new String('X', 926300);
CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
CodeCompileUnit code = new CodeCompileUnit();
// namespace Foo {}
CodeNamespace ns = new CodeNamespace("Foo");
code.Namespaces.Add(ns);
// public class Bar {}
CodeTypeDeclaration type = new CodeTypeDeclaration();
type.IsClass = true;
type.Name = "Bar";
type.Attributes = MemberAttributes.Public;
ns.Types.Add(type);
// public const string HugeString = "XXXX...";
CodeMemberField field = new CodeMemberField();
field.Name = "HugeString";
field.Type = new CodeTypeReference(typeof(String));
field.Attributes = MemberAttributes.Public|MemberAttributes.Const;
field.InitExpression = new CodePrimitiveExpression(HugeString);
type.Members.Add(field);
// generate class file
using (TextWriter writer = File.CreateText("FooBar.cs"))
{
provider.GenerateCodeFromCompileUnit(code, writer, new CodeGeneratorOptions());
}
// compile class file
CompilerResults results = provider.CompileAssemblyFromFile(new CompilerParameters(), "FooBar.cs");
// output reults
foreach (string msg in results.Output)
{
Console.WriteLine(msg);
}
// output errors
foreach (CompilerError error in results.Errors)
{
Console.WriteLine(error);
}
이 아래 실행, 2.0로 나타나는에는 Csc.exe 버전의 .NET 3.5을 목표에도 불구하고 : 검색의 전체 하루를 보낸 후, 나는 철 속도 디자이너 포럼에서 수정이 링크를 발견했다. – mckamey