COM-компонент в f # - PullRequest
       5

COM-компонент в f #

1 голос
/ 31 марта 2011

Я разработчик C ++, который должен написать COM-компонент на F #. Компонент должен работать в системе с .NET 2.0. IDE - это Visual Studio 2010. Я довольно новичок в .NET и F #. Я хотел бы простой образец этого компонента.


UPDATE Спасибо Даниилу за указанное направление. Это мой ответ на вопрос.

namespace COM_FS
open System
open System.Runtime.InteropServices

[<Guid("6E6864CC-5FB7-44B8-B6E3-A5291C9B4AC8")>]
type IExampleFS = interface
  abstract SetString : string -> unit
  abstract GetString : unit -> string
end

[<Guid("01A11F64-59E1-496F-989F-7E0CC5CE8570");
ClassInterface(ClassInterfaceType.None);
ComVisible(true)>]
type ExampleFS_Class = class
  val mutable str : string
  new () = { str = null }
  interface IExampleFS with
    member this.SetString(x) = this.str <- x
    member this.GetString() = this.str
  end
end

И мне пришлось добавить AssemblyInfo.fs к тому же AssemblyInfo.cs

namespace COM_FS

open System.Reflection
open System.Runtime.CompilerServices
open System.Runtime.InteropServices

module AssemblyInfo =
  [<Literal>]
  let public Version = "1.0.0.0"
  [<Literal>]
  let public FileVersion = "1.0.0.0"

[<assembly: AssemblyTitle("COM_FS")>]
[<assembly: AssemblyDescription("")>]
[<assembly: AssemblyConfiguration("")>]
[<assembly: AssemblyCompany("Mycrosoft")>]
[<assembly: AssemblyProduct("COM_FS")>]
[<assembly: AssemblyCopyright("Copyright © Mycrosoft 2011")>]
[<assembly: AssemblyTrademark("")>]
[<assembly: AssemblyCulture("")>]


[<assembly: ComVisible(true)>]
[<assembly: Guid("39ADA032-BF0F-45C9-BE4A-66AD14352F63")>]

[<assembly: AssemblyVersion(AssemblyInfo.Version)>]
[<assembly: AssemblyFileVersion(AssemblyInfo.FileVersion)>]
()

А клиентский C ++ код выглядит как

COM_FS::IExampleFSPtr p(__uuidof(COM_FS::ExampleFS_Class));

_bstr_t str(L"world");
p->SetString(str);
wchar_t* wstr = p->GetString();
std::wcout << wstr << std::endl;

1 Ответ

3 голосов
/ 31 марта 2011

Вы можете перевести интерфейс из образца C # один к одному, с небольшими отличиями в синтаксисе.Это в основном (полностью?) Вопрос применения атрибутов.Кроме того, это не сильно отличается от кодирования чего-либо еще.

ОБНОВЛЕНИЕ

Предполагая, эта статья верна, вот пример синтаксиса:

open System.Runtime.InteropServices

[<Guid("694C1820-04B6-4988-928F-FD858B95C880")>]
type DBCOM_Interface =
    [<DispId(1)>]
    abstract Init : userid:string * password:string -> unit
    //...

[<Guid("47C976E0-C208-4740-AC42-41212D3C34F0"); InterfaceType(ComInterfaceType.InterfaceIsIDispatch)>]
type DBCOM_Events = interface end
...