2009-05-26 6 views
3

Mon application possède une fonctionnalité de script dans laquelle je compile un assembly en mémoire à partir du script de l'utilisateur à l'aide de CodeDomProvider.CompileAssemblyFromSource. C'est similaire à ce qui est décrit dans this answer.Aucun numéro de ligne sur les exceptions de l'assembly généré par CompileAssemblyFromSource

Cela fonctionne très bien, mais toutes les exceptions qui sont levées à partir du code de script n'ont pas de numéros de ligne dans la trace de la pile. J'ai essayé de définir le paramètre compilerParameters.IncludeDebugInformation = true, mais il n'inclut toujours pas les numéros de ligne.

Est-il possible d'obtenir des numéros de ligne sur des exceptions d'un ensemble en mémoire?

Voici les éléments clés de code que je utilise pour compiler l'ensemble:

 CompilerParameters compilerParameters = 
      compilerInfo.CreateDefaultCompilerParameters(); 
     compilerParameters.GenerateInMemory = true; 
     compilerParameters.GenerateExecutable = false; 
     compilerParameters.IncludeDebugInformation = true; 

     ... 

     CodeDomProvider codeProvider = compilerInfo.CreateProvider(); 
     CompilerResults compilerResults = 
      codeProvider.CompileAssemblyFromSource(
       compilerParameters, 
       new string[] { sourceCode }); 

Répondre

4

Nous avons travaillé autour de cela en écrivant la source sur un fichier temporaire, puis en utilisant ce fichier pour compiler le code plutôt qu'une chaîne en mémoire. Cela nous a fourni des informations de débogage significatives que nous n'aurions pas pu obtenir autrement.

+0

Je suppose que c'est un compromis entre les tracas de la gestion et du nettoyage des fichiers temporaires avec l'avantage de l'information de débogage. –

+0

@Don: Exactement. Nous avons essayé de le faire sans fichiers temporaires, mais nous avons essayé à la volée. Cependant, le nettoyage ne fonctionnait pas pour nous en fonction du moment où les fichiers ont été publiés, alors que nous créons les fichiers dans le répertoire temporaire de l'utilisateur, nous l'avons laissé principalement à l'utilisateur pour le nettoyer. –

+0

Oui, c'est ce que nous avons fait aussi. – ShuggyCoUk

2

D'après les commentaires que j'ai trouvé here et here, il semble que le fichier APB pour l'assemblage doit être dans le même répertoire que l'assembly avant les numéros de ligne seront attachés. Il semble que cela exclut les informations de débogage pour les assemblages en mémoire.

0

Dans une application développée pour .NET Framework 4, j'obtiens des numéros de ligne dans les traces de la pile d'exception lorsque le système sur lequel je tourne est .NET Framework 4.5 (ou plus tard) installé, mais je ne les reçois pas il a seulement .NET Framework 4 (profil complet ou client). Donc, oui, il est maintenant possible d'obtenir des numéros de ligne sur les exceptions d'un assemblage en mémoire, à savoir en exécutant .NET Framework 4.5.

+0

Qu'est-ce que tu veux décrire ici? – Ajit

+0

Ceci ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire en dessous de son message - vous pouvez toujours commenter vos propres messages, et une fois que vous aurez suffisamment de [réputation] (http://stackoverflow.com/help/whats-reputation) vous pourrez être capable de [commenter sur n'importe quel post] (http://stackoverflow.com/help/privileges/comment). – shivam

+0

@shivam J'ai modifié la réponse pour ajouter une clarification. Est-il plus clair maintenant que je ne réponds pas à la question (avec une nouvelle réponse qui n'existait pas encore au moment où elle a été posée) et que je ne critique pas ou ne demande pas de clarification? – CWalther

Questions connexes