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它在 scripting 中运行良好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