Ответ 1
Я немного поработаю над этой проблемой. Эта проблема возникает как в VS2015, так и в более ранних версиях. Таким образом, ничего не происходит непосредственно с самим компилятором С#, это происходит неправильно в методе ISymUnmanagedWriter2:: DefineConstant2(). ISymUnmanagedWriter2 - это COM-интерфейс, который является частью инфраструктуры .NET, которую используют все компиляторы. И используется как Roslyn, так и унаследованным компилятором С#.
Комментарии в исходном коде Roslyn (фактически восходят к проекту CCI), который использует этот метод, достаточно освещаются, что проблемы с этим методом были обнаружены раньше:
// EDMAURER If defining a string constant and it is too long (length limit is undocumented), this method throws
// an ArgumentException.
// (see EMITTER::EmitDebugLocalConst)
try
{
this.symWriter.DefineConstant2(name, value, constantSignatureToken);
}
catch (ArgumentException)
{
// writing the constant value into the PDB failed because the string value was most probably too long.
// We will report a warning for this issue and continue writing the PDB.
// The effect on the debug experience is that the symbol for the constant will not be shown in the local
// window of the debugger. Nor will the user be able to bind to it in expressions in the EE.
//The triage team has deemed this new warning undesirable. The effects are not significant. The warning
//is showing up in the DevDiv build more often than expected. We never warned on it before and nobody cared.
//The proposed warning is not actionable with no source location.
}
catch (Exception ex)
{
throw new PdbWritingException(ex);
}
Глотание исключений, tsk, tsk. Он умирает в последнем случае catch в вашем случае. Они немного углубились в обратное проектирование проблемы длины строки:
internal const int PdbLengthLimit = 2046; // Empirical, based on when ISymUnmanagedWriter2 methods start throwing.
Что довольно близко к тому, где \0 начинает бросать, я получил 2034. Ничего особенного, что вы или кто-то еще здесь не может сделать по этому поводу, конечно. Все, что вы можете сделать, это сообщить об ошибке на сайте connect.microsoft.com. Но, надеюсь, вы видите письменность на стене, вероятность того, что она будет исправлена, довольно мала. Это код, который больше никто не поддерживает, теперь он имеет статус "недокументированный", и, судя по другим комментариям, это происходит задолго до .NET. Не Эд Маурер тоже:)
Обходной путь должен быть достаточно простым, приклеить эту строку вместе во время выполнения.