Почему код C#, скомпилированный на лету, не работает при подключенном отладчике?C#

Место общения программистов C#
Ответить
Anonymous
 Почему код C#, скомпилированный на лету, не работает при подключенном отладчике?

Сообщение Anonymous »

У меня есть следующий проект C#, ориентированный на .NET 4.0, который берет файл исходного кода, на лету компилирует его в сборку, а затем выполняет статический метод типа, содержащегося в этой сборке.

Это работает так, как и ожидалось, пока я не запускаю программу с подключенным отладчиком. В этом случае я получаю исключение при вызове xmlSerializer.Serialize(sw, Family);, точнее, System.NullReferenceException внутри System.TypeInitializationException внутри System.InvalidOperationException< /code>.

Если я возьму ту же программу, включу в проект файл исходного кода и скомпилирую его непосредственно в основную сборку программы, то исключения не получу невзирая на независимо от того, подключен ли отладчик.

Обратите внимание, что мой проект ссылается на те же самые сборки, которые указаны при компиляции на лету.

Почему для кода, компилируемого на лету, важно наличие отладчика или нет? Что мне не хватает?

Основной файл Program.cs:

using System;
using System.CodeDom.Compiler;
using System.IO;
using System.Reflection;
using System.Linq;

namespace DebugSerializeCompiler
{
class Program
{
static void Main()
{
if (!Environment.GetCommandLineArgs().Contains("Compile"))
{
DebugSerializeCompiler.SerializerTest.Run();
}
else
{
Assembly assembly;
if (TryCompile("..\\..\\SerializerTest.cs", new[]{ "Microsoft.CSharp.dll",
"System.dll", "System.Core.dll", "System.Data.dll", "System.Xml.dll" },
out assembly))
{
Type type = assembly.GetType("DebugSerializeCompiler.SerializerTest");
MethodInfo methodInfo = type.GetMethod("Run");
methodInfo.Invoke(null, null);
}
}
Console.ReadKey();
}

static bool TryCompile(string fileName, string[] referencedAssemblies,
out Assembly assembly)
{
bool result;

CodeDomProvider compiler = CodeDomProvider.CreateProvider("CSharp");
var compilerparams = new CompilerParameters
{
GenerateExecutable = false,
GenerateInMemory = true
};
foreach (var referencedAssembly in referencedAssemblies)
{
compilerparams.ReferencedAssemblies.Add(referencedAssembly);
}

using (var reader = new StreamReader(fileName))
{
CompilerResults compilerResults =
compiler.CompileAssemblyFromSource(compilerparams, reader.ReadToEnd());
assembly = compilerResults.CompiledAssembly;
result = !compilerResults.Errors.HasErrors;
if (!result)
{
Console.Out.WriteLine("Compiler Errors:");
foreach (CompilerError error in compilerResults.Errors)
{
Console.Out.WriteLine("Position {0}.{1}: {2}",
error.Line, error.Column, error.ErrorText);
}
}
}

return result;
}
}
}


Файл скомпилирован в отдельную сборку SerializerTest.cs:

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

namespace DebugSerializeCompiler
{
public class SerializerTest
{
public static void Run()
{
Console.WriteLine("Executing Run()");
var family = new Family();
var xmlSerializer = new XmlSerializer(typeof(Family));

TextWriter sw = new StringWriter();
try
{
if (sw == null) Console.WriteLine("sw == null");
if (family == null) Console.WriteLine("family == null");
if (xmlSerializer == null) Console.WriteLine("xmlSerializer == null");
xmlSerializer.Serialize(sw, family);
}
catch (Exception e)
{
Console.WriteLine("Exception caught:");
Console.WriteLine(e);
}
Console.WriteLine(sw);
}
}

[Serializable]
public class Family
{
public string LastName { get; set; }

public List FamilyMembers { get; set; }
}

[Serializable]
public class FamilyMember
{
public string FirstName { get; set; }
}
}


Это файл csproj, используемый для компиляции проекта с использованием Visual C# 2010 Express в Windows 7:




Debug
x86
8.0.30703
2.0
{7B8D2187-4C58-4310-AC69-9F87107C25AA}
Exe
Properties
DebugSerializeCompiler
DebugSerializeCompiler
v4.0
Client
512


x86
true
full
false
bin\Debug\
DEBUG;TRACE
prompt
4


x86
pdbonly
true
bin\Release\
TRACE
prompt
4












Code







Подробнее здесь: https://stackoverflow.com/questions/929 ... s-attached
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»