2016-05-14 17 views
6

Ho bisogno di IMessage Interface. In C# ho potuto scrivereCome creare un oggetto COM in F #

CDO.Message oMsg = new CDO.Message(); // ok 

ma quando provo a fare questo in F #

let oMsg = new CDO.Message() 

ottengo un messaggio di errore:

'nuovo' non può essere utilizzato su tipi di interfaccia. Prendi in considerazione l'utilizzo di un'espressione di oggetto '{new ... with ...}'.

Come risolvere questo problema?

+3

http://stackoverflow.com/questions/37145234/how-to-convert-c-sharp-code-that-uses-shell-com-to-f/37150493#37150493 –

+0

Di interesse: [ Provider di tipi COM per F #] (https://fsprojects.github.io/FSharp.ComProvider/) –

risposta

8

è necessario utilizzare la versione che ha la "Classe" aggiunto al nome dell'interfaccia:

open System 

[<EntryPoint>] 
[<STAThread>] 
let main argv = 
    let oMsg = new CDO.MessageClass() 
    oMsg.Subject <- "Hello World" 
    Console.WriteLine(oMsg.Subject) 
    Console.ReadLine() |> ignore 
    0 

Nota: Ho anche esplicitamente dovuto aggiungere un riferimento alla Microsoft ActiveX Data Objects 6.0 Library al progetto per rendere il lavoro di istanze di oggetti .

Nel caso in cui si desideri utilizzare l'interfaccia specifica e non la Co-classe (come proposto da Hans Passant), utilizzare questa versione che inserisce la Co-classe creata nell'interfaccia, restituendo di conseguenza un puntatore all'interfaccia reale.

open System 

[<EntryPoint>] 
[<STAThread>] 
let main argv = 
    let oMsg = upcast new CDO.MessageClass() : CDO.IMessage 
    oMsg.Subject <- "Hello World" 
    Console.WriteLine(oMsg.Subject) 
    Console.ReadLine() |> ignore 
    0 
+0

Funziona come un fascino. Molte grazie. –

+0

Dai un'occhiata al duplicato collegato per capire perché l'inferenza di tipo non è una grande idea. –

+0

Variante aggiunta che utilizza l'interfaccia e non la co-classe per accedere ad altri membri dopo la creazione – NineBerry

Problemi correlati