我在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[]{""});
代码抛出异常:
mscorlib.dll中发生了
System.MissingMethodException
类型的未处理异常 其他信息:试图访问失踪成员。
Everything(组件,测试C#和F#项目,regasm,cscript)在x64或x86中始终如一。使用相同的结果 - WSH脚本可以工作,.NET程序集不会。