我正在 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.MissingMethodException
mscorlib.dll中出现未处理的类型异常
附加信息:试图访问丢失的成员。
一切(组件、测试 C# 和 F# 项目、regasm、cscript)始终在 x64 或 x86 中。结果相同 - WSH 脚本有效,.NET 程序集无效。