2010-07-18 3 views
1

Dans ma solution de VS2010, un projet d'application C# fait référence à un projet de bibliothèque F #.Aucune source disponible lors du débogage de l'application C# qui référence F # lib

Lorsqu'un NullReferenceException est lancé à partir de F # lib, le débogueur ne trouve pas l'exception de point levée. Il dit juste «aucune source disponible».

Devrais-je modifier certaines options ou est-ce une limitation de VS2010?

j'ai ajouté quelques exemples de code:

F # projet 'Library1'

module Module1 

type AA() = 
    let _a = "xx" 
    member x.a = _a 

let aa:AA option = None 

let b() = 
    aa.Value.a // null reference occurs here 

projet C# 'ConsoleApp1'

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      Console.Out.Write(Module1.b()); 
      Console.In.Read(); 
     } 
    } 
} 

Répondre

2

Cela devrait, en principe, le travail sans Seting toutes les options supplémentaires . Quelques éléments à vérifier:

  • L'exécution peut-elle localiser le fichier PDB de votre bibliothèque F #? Il devrait faire cela si le fichier PDB est dans le même répertoire que la DLL. Vous pouvez également regarder la fenêtre "Sortie" et sélectionner "Déboguer" dans la liste déroulante pour voir les informations imprimées lorsque l'application a démarré - vous pouvez y voir si les symboles ont été chargés ou non. Si vous avez des symboles PDB dans un répertoire spécial, vous pouvez spécifier le répertoire dans Outils -> Options -> Débogage -> Symboles. Que se passe-t-il lorsque vous essayez de définir un point d'arrêt dans la source F #? Est-ce que ça dit quelque chose comme "symboles non chargés" (et montre le point d'arrêt en couleur grise)? Est-ce qu'il montre des informations supplémentaires qui pourraient être utilisées pour trouver la cause du problème?

+0

Thnx Tomas. J'ai vérifié que le pdb est dans le même répertoire et la fenêtre de sortie indique que les symboles de la bibliothèque F # sont chargés. Breakpoint fonctionne également bien. Mais toujours 'aucune source disponible' J'ai ajouté un exemple de code dans ma question. Thnx. –

+0

Probablement pas la cause du problème (des exemples ont été ajoutés après cette réponse), mais un +1 de moi, car des conseils de débogage utiles sont utiles. – cfern

0

L'erreur n'est pas due à des problèmes d'interopérabilité C#/F #. Lorsque vous appelez le b(), il tente d'accéder à la valeur de l'option Valeur d'un aucun, ce qui renvoie une exception de référence null au moment de l'exécution. Dans la bibliothèque F #, remplacez let aa:AA option = None par let aa:AA option = Some(AA()). Le code C# devrait alors imprimer 'xx'.

Lors de l'exposition d'un type d'option F # au monde extérieur, vous pouvez autoriser une valeur de retour nulle à partir d'une option vide au lieu d'une exception. Par exemple:

module Module1 

//attribute needed in order to be able to return null from the match statement 
[<AllowNullLiteralAttribute>] 
type AA() = 
    let _a = "xx" 
    member x.a = _a 

let aa:AA option = None 

let b() = match aa with 
      | None -> null 
      | Some value -> value 

Et vérifiez null dans tout code qui utilise cette bibliothèque F #. Remarque: l'attribut AllowNullLiteral. Essayez de commenter cet attribut et vous verrez que F # ne reconnaîtra pas la valeur null dans la première branche de correspondance.

+0

Thnx, cfern. En fait, ma question concerne le débogage.Mon code utilise beaucoup de valeurs , et je suppose que l'un d'entre eux fait une exception de référence nulle, mais je ne peux pas le trouver facilement. Il se peut que je doive faire une correspondance de type chaque fois que j'utilise les valeurs-type . –

Questions connexes