3

F# で COM コンポーネントを作成しています。このコンポーネントは、スクリプトから使用されることが想定されています。

コンポーネントコード:

namespace WebUIPlugin

open System
open System.Windows
open System.Runtime.InteropServices

[<Guid("BAEF0C5B-EFA5-4868-8342-7A1E6F8F7AF4")>]
type IPlugin =
    [<DispId(1)>]
    abstract OpenFormFromFile : path:string -> unit

[<Guid("8D71E2DB-D718-4595-B856-58D14EEAEBB2");
ClassInterface(ClassInterfaceType.None);
ComVisible(true)>]
type Plugin = class
  new () = {}

  interface IPlugin with
    member this.OpenFormFromFile(path) =
      let showWindow =
        let window = Window()
        window.Show

      UI.spawn showWindow |> ignore
  end
end

私はそれを登録していregasm /codebase Plugin.dllますが、スクリプトからうまく機能しますcscript test.js

test.js は次のとおりです。

var obj = new ActiveXObject("WebUIPlugin.Plugin");
obj.OpenFormFromFile("");

のブレークポイントでも停止しますOpenFormFromFile。これまでのところとても良い。

残念ながら、F#/C# から動作させることはできません:

let objectType = Type.GetTypeFromProgID("WebUIPlugin.Plugin")
let handler = Activator.CreateInstance(objectType)
objectType.InvokeMember("OpenFormFromFile", BindingFlags.InvokeMethod, null, handler, [|""|]) |> ignore
var objectType = Type.GetTypeFromProgID("WebUIPlugin.Plugin");
dynamic handler = Activator.CreateInstance(objectType);
objectType.InvokeMember("OpenFormFromFile", BindingFlags.InvokeMethod, null, handler, new object[]{""});

コードは例外をスローします:

タイプの未処理の例外がSystem.MissingMethodExceptionmscorlib.dll で発生しました
追加情報: 不足しているメンバーにアクセスしようとしました。

すべて (コンポーネント、テスト C# および F# プロジェクト、regasm、cscript) は一貫して x64 または x86 のいずれかです。同じ結果で、WSH スクリプトは機能しますが、.NET アセンブリは機能しません。

4

0 に答える 0