如何在F#中创建COM对象

8
我需要 IMessage 接口。在 C# 中,我可以这样写:
CDO.Message oMsg = new CDO.Message(); // ok

但是当我尝试在F#中实现这个时

let oMsg = new CDO.Message()

我收到了一个错误信息:
'new' 不能用于接口类型。请考虑使用对象表达式 '{ new ... with ... }' 来代替。
如何解决这个问题?

3
https://dev59.com/W5bfa4cB1Zd3GeqP0ezd#37150493 - Hans Passant
有趣的内容:F# 的 COM 类型提供程序 - Guy Coder
1个回答

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 
注意:我还必须明确地将对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 

1
非常好用。非常感谢。 - Oleg Leonov
请查看链接的重复内容,了解为什么类型推断不是一个好主意。 - Hans Passant
添加了一种使用接口而不是协同类来访问创建后的其他成员的变体。 - NineBerry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接