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.MissingMethodException
mscorlib.dll で発生しました
追加情報: 不足しているメンバーにアクセスしようとしました。
すべて (コンポーネント、テスト C# および F# プロジェクト、regasm、cscript) は一貫して x64 または x86 のいずれかです。同じ結果で、WSH スクリプトは機能しますが、.NET アセンブリは機能しません。