Можно ли отлаживать код, скомпилированный во время выполнения? - PullRequest
10 голосов
/ 08 апреля 2011

Мне нужно скомпилировать код, используя CodeDomProvider.CompileAssemblyFromSource. Как можно было бы отладить его? По сути, я хочу скомпилировать его, создать экземпляр типа и затем перейти к коду для этого типа.

Ответы [ 3 ]

9 голосов
/ 08 апреля 2011

После того, как я отправил вопрос, я понял, что моя проблема была в том, что я генерировал сборку из строки, а не из файла.Я вернулся и изменил код для запуска с различными параметрами, когда в DEBUG, и я могу перейти прямо из кода модульного теста.Также необходимо установить для GenerateInMemory значение false, а для IncludeDebugInformation - значение true.

#if DEBUG
            @params.IncludeDebugInformation = compilationContext.IncludeDebugInformation;
            @params.GenerateInMemory = compilationContext.GenerateInMemory;
            var fileName = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,@"..\..\" + compilationContext.AssemblyOutputName + ".cs"));
            File.WriteAllText(fileName,compilationContext.StringToCompile);
            return _codeDomProvider.CompileAssemblyFromFile(@params,fileName);
#else
            return _codeDomProvider.CompileAssemblyFromSource(@params, compilationContext.StringToCompile);
#endif
3 голосов
/ 08 апреля 2011

Интересный вопрос.Я думаю, что вам лучше всего использовать WinDbg для подключения к запущенному процессу .NET exe (думаю, вам придется сделать это после того, как tyoe будет скомпилировано в памяти, поскольку адреса памяти для EXE-файлаизменится - я предполагаю).

Затем, когда тип скомпилирован и запущен в памяти, вы можете искать этот тип с помощью команд, найденных в SOS.dll.Вы также можете поместить точки останова в память, используя SOS.dll

Начало работы со ссылкой SOS

http://rionisimpsoni.wordpress.com/2009/10/08/getting-started-with-windbg-and-sos-dll/

Это немного легкий ответ, поскольку объяснение того, как использовать WinDbg и SOS.dll, много раз освещалось в Интернете.

Редактировать:

Одним из недостатков этого метода является то, что вы не сможетеувидеть исходный код, как Visual Studio отображает его.По мере выполнения кода вы увидите язык ассемблера.Это может вас уже оттолкнуть :), но если вы будете придерживаться этого и понимать немного сборки, вы можете сделать достаточно, например, для отладки ошибок.

Еще одна вещь, которую вы можете сделать, - вывести сборку .NETиз памяти в файл на диске.Команда SOS.dll, которая делает это, ускользает от меня сейчас, я пойду поищу ...

Ааа, это SaveModule.Пример этого можно найти в комментариях здесь .

0 голосов
/ 08 апреля 2011

Вы пытались подключиться к процессу, используя свой код из функции Отладка> Присоединить к процессу в VS?

...