C#などで作った外部の「マネージドな.dll」の読み込み概要hmJSは、好きなフォルダに置いた自作のマネージドな.dllを(特に署名などもなく)突如自由に読みだして利用することが可能です。 「C#」はもちろんのこと「VB.net」「C++/CLI」「F#」「JScript.net」などで作成したdllを読み込むことが出来ます。 C#のソースから.dllを作成。最小限のサンプルとするため、わかりやすい構成としましょう。 hmJS自体は、.NET Framework 4.0で構成されていますが、
とします。 コンパイルし、TestSample.dllといった名前にしたとしましょう。 using System; namespace TestNameSpace { public class TestClass { public TestClass() { } public int TestFuncNum(int x) { return x + 3; } public String TestFuncStr(String s) { return s + s; } // 可変長引数 public int TestFuncMax(params int[] a) { int max = a[0]; for(int i=1; i<a.Length; ++i) { if(max < a[i]) max = a[i]; } return max; } } } loadするhmJSの例host.libを利用することでアセンブリを読み込むことが出来ます。 読み込めたマネージdllの内容は、hmJSに取り込まれ、直接JavaScriptで以下のように利用可能です。 // マクロが置いてある場所に.dllが置いてあるものとする。 // マクロが置いてある場所と、.dllが置いてある場所が違うなら、「"C:/xxx/xxx/xx.dll"」などと具体的にフルパスを指定すれば良い #JS = loaddll( hidemarudir + @"\hmJS.dll" ); #_ = dllfuncw( #JS, "DoString", R"JS( currentmacrodirectory = hm.Macro.Var('currentmacrodirectory'); var addlib = host.lib(currentmacrodirectory + "/TestSample.dll"); var obj = new addlib.TestNameSpace.TestClass(); result_num = obj.TestFuncNum(10) result_str = obj.TestFuncStr("あいう") result_max = obj.TestFuncMax(1, 100, -5, 101, 10) hm.debuginfo(result_max) result_max = obj.TestFuncMax(1, 10) hm.debuginfo(result_max) hm.Macro.Var('#result_num', result_num); hm.Macro.Var('$result_str', result_str); )JS" ); message(str(#result_num)); message($result_str); freedll( #JS ); hidemarudirやcurrentmacrodirectoryは読み込み対象ディレクトリとなっているhmJSでは、実行するマクロファイルと同じ場所(currentmacrodirectory)に、読み込み対象の.dllがある場合、 var addlib = host.lib("TestSample"); // hidemarudir もしくは、currentmacrodirectoryにあるTestSample.dllのロードを試みる 自作の個人的なディレクトリを、「.dll(アセンブリ)の置き場所」として認識させるアセンブリの.dllは本来配置場所が自由ではありません。
#JS = loaddll( hidemarudir + @"\hmJS.dll" ); #_ = dllfuncw( #JS, "DoString", R"JS( // C:\aaaのフィルダは.dllの置き場所として加える。 AssemblyPath.Add("C:/aaa"); // var addlib = host.lib("C:/aaa/TestSample.dll"); と別変数に受けるのではなく、既存の「clr」にたしこむ形で受 host.lib(clr, "TestSample"); var obj = new clr.TestNameSpace.TestClass(); result_num = obj.TestFuncNum(10) result_str = obj.TestFuncStr("あいう") result_max = obj.TestFuncMax(1, 100, -5, 101, 10) hm.debuginfo(result_max) result_max = obj.TestFuncMax(1, 10) hm.debuginfo(result_max) hm.Macro.Var('#result_num', result_num); hm.Macro.Var('$result_str', result_str); )JS" ); freedll( #JS ); |