2016-05-14 4 views
6

Ich brauche IMessage-Schnittstelle. In C# könnte ichSo erstellen Sie ein COM-Objekt in F #

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

schreiben, aber wenn ich versuche, dies # in F zu tun

let oMsg = new CDO.Message() 

Ich erhalte eine Fehlermeldung:

'neue' nicht auf Schnittstellentypen verwendet werden kann. Erwägen Sie stattdessen, einen Objektausdruck '{new ... with ...}' zu verwenden.

Wie löst man dieses Problem?

+3

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

+0

Von Interesse: [ COM Type Provider für F #] (https://fsprojects.github.io/FSharp.ComProvider/) –

Antwort

8

Sie müssen die Version verwenden, die die „Klasse“ hinzugefügt, um den Interface-Namen hat:

open System 

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

Hinweis: Ich hatte auch ausdrücklich einen Hinweis auf Microsoft ActiveX Data Objects 6.0 Library zum Projekt hinzufügen, um die Objektinstanziierung Arbeit zu machen .

Wenn Sie die spezifische Schnittstelle und nicht die Co-Klasse (wie von Hans Passant vorgeschlagen) verwenden möchten, verwenden Sie diese Version, die die erstellte Co-Klasse auf die Schnittstelle überträgt und damit einen Zeiger auf die tatsächliche Schnittstelle zurückgibt.

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

Funktioniert wie ein Zauber. Danke vielmals. –

+0

Werfen Sie einen Blick auf das verknüpfte Duplikat, um zu sehen, warum Typinferenz keine gute Idee ist. –

+0

Hinzugefügt Variante, die die Schnittstelle und nicht die Co-Klasse verwendet, um nach der Erstellung auf weitere Mitglieder zuzugreifen – NineBerry