私は大きな文字列constを持つクラスを生成する必要がある状況があります。私のコントロール外のコードは、生成されたCodeDomツリーをC#ソースに出力し、後に大きなアセンブリの一部としてコンパイルします。csc.exeのスタックオーバーフロー(CS1647)を引き起こすC#CodeDomの回避策?
fatal error CS1647: An expression is too long or complex to compile near 'int'
MSDN:
残念ながら、私はこの文字列の長さはWin2K8 x64版で335440文字(WIN2K3のx86で926240)、致命的なエラーとC#コンパイラの終了を超えたことにより、場合、状況に遭遇しましたCS1647は「コンパイラでのスタックオーバーフロー」です(何も意図していません)。より密接に見ると、CodeDomが文字列constを80文字で "うまく"ラップすることが判明しました。これは、x64 NetFxのC#コンパイラのスタック深度である4193文字列チャンクを連結します。 CSC.exeは、この式を内部的に再帰的に評価して、単一の文字列を再水和する必要があります。 "外部システムがC#ソースを中間体として使用しているという事実を制御することはできません。私はこれを欲しがっています。 (文字列の実行時連結ではなく)定数にする。
また、はどのように私はこの表現は、文字の特定の番号の後、私はまだ定数を作成することができると思っているように定式化することができますが、それはチャンク大多数ので構成されていますか?
全REPROはここにある:
// 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);
}
これは、.NET 3.5をターゲットにもかかわらず、2.0のように見えるの下で実行さcsc.exeバージョン:検索の完全な一日を過ごした後、私は鉄のスピードデザイナーフォーラムで解決するには、このリンクを見つけました。 – mckamey