如何在F#中创建COM对象#

问题描述:

我需要IMessage接口。在C#中我可以写如何在F#中创建COM对象#

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

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

let oMsg = new CDO.Message() 

我得到一个错误信息:

'新' 不能在接口类型使用。考虑使用对象表达式'{new ... with ...}'来代替。

如何解决这个问题?

+3

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

+0

有趣的是: COM类型提供程序的F#](https://fsprojects.github.io/FSharp.ComProvider/) –

您需要使用具有“类”添加到接口名称版本:

open System 

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

注:我也明确了一个参考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 
+0

工程就像一个魅力。非常感谢。 –

+0

做一下链接的副本,看看为什么类型推断不是一个好主意。 –

+0

添加了使用接口而不是共同类来创建后访问更多成员的变体 – NineBerry