如何在F#中创建COM对象

Ole*_*nov 8 com f#

我需要IMessage接口.在C#我可以写

CDO.Message oMsg = new CDO.Message(); // ok
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在F#中这样做时

let oMsg = new CDO.Message()
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

'new'不能用于接口类型.考虑使用对象表达式'{new ... with ...}'.

如何解决这个问题呢?

Nin*_*rry 11

您需要使用在接口名称中添加"Class"的版本:

open System

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

注意:我还明确地必须添加Microsoft ActiveX Data Objects 6.0 Library对项目的引用以使对象实例化起作用.

如果您想使用特定接口而不是Co-Class(由Hans Passant提出),请使用此版本将创建的Co-Class强制转换为接口,从而返回指向实际接口的指针.

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 
Run Code Online (Sandbox Code Playgroud)