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

标签 f# com

我需要 IMessage 接口(interface)。在 C# 中我可以写

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

但是当我尝试在 F# 中执行此操作时
let oMsg = new CDO.Message()

我收到一条错误消息:

'new' cannot be used on interface types. Consider using an object expression '{ new ... with ... }' instead.



如何解决这个问题呢?

最佳答案

您需要使用在接口(interface)名称中添加了“类”的版本:

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 的引用。到项目以使对象实例化工作。

如果您想使用特定接口(interface)而不是 Co-Class(如 Hans Passant 建议的那样),请使用将创建的 Co-Class 转换为接口(interface)的此版本,从而返回指向实际接口(interface)的指针。
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 

关于f# - 如何在 F# 中创建 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37226321/

相关文章:

generics - 如何访问在 F# 中声明为泛型参数的类型的静态成员

c - 如何用原始 C 编写 COM 服务器?

c# - COM-Interop:将 .NET Framework 版本从 2.0 更改为 4.0 - 我是否也应该更改 Guid?

c++ - VB脚本与COM接口(interface)继承相关的查询

list - F#中的列表序列?

c# - F# 程序集引用导致构建问题?

concurrency - 将 Post 或 PostAndAsyncReply 与 F# 的 MailboxProcessor 一起使用?

f# - 运算符(operator)</>在FAKE构建脚本中做什么?

com - 如何安装 32 位和 64 位版本的 COM DLL 和 "auto-select"?

c++ - 编写针对 IE7 的 BHO