2009-10-24 4 views
4

J'ai vu une démo de F # et DirectX.Puis-je utiliser F # Interactive pour créer un script ou déboguer/tester interactivement mes projets d'interface graphique C#?

L'utilisateur sélectionne une partie du code F # et l'envoie à F # interactif. Il entre, le thread du formulaire fonctionne: le formulaire affiche le contenu dynamique et répond aux clics.

Puis-je conclure que pour # C existants WinForms projettent je peux créer un projet F # qui fait référence à ce puis lancer le projet F # dans F # interactive pour exécuter des méthodes arbitraires d'une forme ?

EDIT: quelles sont les étapes à suivre pour appeler btShowNextNumber_Click dans une application en cours d'exécution?

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    int i = 0; 

    private void btShowNextNumber_Click(object sender, EventArgs e) 
    { 
     ++i; 
     label1.Text = i.ToString(); 
    } 
} 

Répondre

7

Bien sûr.En F # interactive, vous voulez exécuter quelque chose comme:

#r "MyDllName.dll" 
open MyNamespace 

// Call the constructor to get a new form, then show it 
let form = Form1() 
form.Show() 

// Call whatever public method you want 
form.MyMethodThatIWantToUse()  
+0

Ah! Je viens de remarquer que les points d'arrêt dans le projet C# ne fonctionnent pas de cette façon. Des idées pour les faire fonctionner? –

+3

Oui. Je viens de le trouver. On a attacher le débogueur manuellement à fsi.exe. –

2
+0

Merci pour la remarque. Oui, le projet C# est conforme à CLS. En fait, le 'wonder' que j'ai vu est que F # interactive garde un 'Application.Run()' en cours d'exécution et invoque du code dans le thread d'interface utilisateur. Je ne sais pas comment faire ça actuellement. –

2

F # est juste un tel langage CLR comme C# ou VB sont. Cela signifie qu'il peut faire référence à des assemblys CLR (DLL et EXE), en importer des classes publiques et appeler des méthodes et des propriétés publiques. Si la classe, la méthode ou la propriété ne sont pas publiques, vous pouvez toujours y accéder en utilisant la réflexion, mais il y a peu de cas où vous devriez vraiment le faire.

Notez que pour que les éléments de l'interface utilisateur WinForm répondent aux actions de l'utilisateur, vous devez exécuter la boucle de messages Windows (en utilisant Application.Run). Dans le cas d'un shell F #, il semble qu'ils l'exécutent dans un thread d'arrière-plan et publient des actions sur ce thread en utilisant Control.Invoke ou ses équivalents (WindowsFormsSynchronizationContext).

Pour appeler la méthode que vous avez montré dans l'échantillon que vous devez faire une des opérations suivantes:

1) si la méthode btShowNextNumber_Click est public:

form.Invoke(new Action(()=> form.btShowNextNumber_Click(form, EventArgs.Empty))); 

ou

SynchronizationContext.Current.Send(o => form.btShowNextNumber_Click(form, EventArgs.Empty)); 

2) si la méthode btShowNextNumber_Click n'est pas publique, mais le bouton btShowNextNumber est:

form.Invoke(new Action(()=> form.btShowNextNumber.PerformClick()); 

ou

SynchronizationContext.Current.Send(o => form.btShowNextNumber.PerformClick()); 

Pour autant que je comprends la façon dont F fonctionne # shell, il peut être paramétré jusqu'à commandes de poste que vous postez à travers SynchronizationContext.Send transparente, tout comme IronPython shell does. Je ne peux pas dire exactement comment cela fonctionne pour le moment. Besoin de vérifier

+0

L'exécution du code Application.Run() dans le thread d'arrière-plan et l'invocation du code est la fonctionnalité que je recherche. –

+0

Savez-vous comment? Dois-je adapter le projet C#? Oui, toutes les méthodes nécessaires sont publiques, je ne sais pas quoi envoyer à F # interactif. –

+0

Merci. Je me promenais aussi comment cela se fait en dessous. –

1

Vous avez besoin d'un débogueur prenant en charge le code managé. Peu importe quelle langue est utilisée pour écrire l'hôte de votre code. Je débogue mon code dans différents conteneurs comme MS Office, Internet Explorer, Windows Explorer, Visual Studio et d'autres applications VB/C# tout le temps.

5

Vous pouvez également ajouter:

Debugger.Launch() 

au script. Cela fera apparaître une boîte de dialogue demandant quel débogueur utiliser. Par exemple. vous pouvez utiliser la même instance de studio visuel que celle que vous utiliseriez pour exécuter le script.

Questions connexes