2016-05-14 13 views
6

IMessage Interfaceが必要です。 C#では、私はF#でCOMオブジェクトを作成するには

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

を書くことができますが、私はF#の

let oMsg = new CDO.Message() 

でこれを実行しようとするとき、私はエラーメッセージを取得:

は '新しい' インターフェイスタイプに使用することはできません。代わりにオブジェクト式 '{new ... with ...}'を使用することを検討してください。

この問題を解決するにはどうすればよいですか?

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への参照を追加する必要がありましたあなたは「クラス」は、インタフェース名に追加したバージョンを使用する必要が

+3

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

+0

:[ COM Type Provider for F#](https://fsprojects.github.io/FSharp.ComProvider/) –

答えて

8

(Hans Passantが提案したように)特定のインターフェイスを使用し、Co-Classを使用しない場合は、作成した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

関連する問題