これはCOMだから、インターフェイスを定義することから始めます。簡単にしましょう。
[Guid("a5ee0756-0cbb-4cf1-9a9c-509407d5eed6")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IGreet
{
[DispId(1)]
string Hello(string name);
[DispId(2)]
Object onHello { get; set; }
}
そして、実装:
[ProgId("Cheeso.Greet")]
[ComVisible(true)]
[Guid("bebcfaff-d2f4-4447-ac9f-91bf63b770d8")]
[ClassInterface(ClassInterfaceType.None)]
public partial class Greet : IGreet
{
public Object onHello { get; set; }
public String Hello(string name)
{
var r = FireEvent();
return "Why, Hello, " + name + "!!!" + r;
}
}
メイントリックFireEvent
方法です。これは私のために働いた。
%NET64%\regasm.exe Cheeso.Greet.dll /register /codebase
を...そして、このようのJScriptからそれを使用します:それは作品
var greet = new ActiveXObject("Cheeso.Greet"), response;
greet.onHello = function() {
WScript.Echo("onHello (Javascript) invoked.");
};
response = greet.Hello("Fred");
WScript.Echo("response: " + response);
をすべて一緒に、します。regasmに登録
private string FireEvent()
{
if (onHello == null) return " (N/A)";
onHello
.GetType()
.InvokeMember
("",
BindingFlags.InvokeMethod,
null,
onHello,
new object [] {});
return "ok";
}
コンパイル。あなたはまた、VBScriptのからそれを呼び出すことができます
:
Sub onHello()
WScript.Echo("onHello (VBScript) invoked.")
End Sub
Dim greet
Set greet = WScript.CreateObject("Cheeso.Greet")
greet.onHello = GetRef("onHello")
Dim response
response = greet.Hello("Louise")
WScript.Echo("response: " & response)
このアプローチにバックのC#からのJScriptにパラメータを渡すために、私は、オブジェクトがIDispatchをする必要があると思うが、もちろん、あなたが戻ってシンプル送ることができます文字列、intなどのマーシャリングされた値は、期待通りにマーシャリングされます。
たとえば、C#コードを変更して、自分自身への参照と番号42を返すようにします。そのよう
greet.onHello = function(arg, num) {
WScript.Echo("onHello (Javascript) invoked.");
WScript.Echo(" num = " + num + " stat=" + arg.status);
};
またはVBScriptで:
onHello
.GetType()
.InvokeMember
("",
BindingFlags.InvokeMethod,
null,
onHello,
new object [] { this, 42 });
その後、あなたはそうのようなJScriptでそれを得ることができます
Sub onHello (obj, num)
WScript.Echo("onHello (VBScript) invoked. status=" & obj.status)
WScript.Echo(" num= " & num)
End Sub
NB:あなたが受け入れるようにあなたのJScriptイベントハンドラ関数を定義することができますが"イベント"を呼び出すときにC#オブジェクトによって送信されるよりも少ない数の引数があります。私の経験上、正しい数の引数を明示的に受け入れるには、VBScriptでイベントハンドラを設計する必要があります。
これはイベントではなく、遅延バインドコールです。 [ComSourceInterfaces]属性を使用して.NETイベントを公開します。 –
正確に。これはCOMイベントではありませんが、この制限されたシナリオ(COMイベントを1つのオブジェクトとそのオブジェクトの1人のユーザー)に配線するよりも、構築して使用する方が簡単です。実際、COMイベントではありませんが、プログラマは、スクリプト可能なオブジェクトの「イベント」のニーズを満たすために正しく理解しています。これは、XMLHttpRequestが 'onreadystatechange'のためのアプローチを使用している理由です。それも、「**イベントではない」**ですが、確かに何百万人もの開発者によるイベントと理解されています。 COMの用語「イベント」の特定の定義は、いくつかの目的には関係ありません。 – Cheeso
JScriptでActiveXObjectを作成するとき、 '' Cheeso.Greetは '' ProjId'、DLL名、 'Namespace.ClassName'または他の場所から来ますか?私が何を試しても、私はいつも "オートメーションサーバーはオブジェクトを作成できません"と思われます。 –