C#などで作った外部の「マネージドな.dll」の読み込み概要hmLNは、好きなフォルダに置いた自作のマネージドな.dllを(特に署名などもなく)突如自由に読みだして利用することが可能です。 「C#」はもちろんのこと「VB.net」「C++/CLI」「F#」「JScript.net」などで作成したdllを読み込むことが出来ます。 C#のソースから.dllを作成。最小限のサンプルとするため、わかりやすい構成としましょう。 hmLN自体は、.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するhmLNの例clr.System.Reflection.Assembly:LoadFromを利用することでアセンブリを読み込むことが出来ます。 読み込めたマネージdllの内容は、clr以下に取り込まれます 以下の内容をファイル名「loaddlltest.mac」とでもして保存してみましょう。 #MNG = loaddll( hidemarudir + @"\hmLN.dll" ); #_ = dllfuncw(#MNG, "DoString", R"MNG( -- 読み込めたら clr内にアセンブリとして読み込まれる clr.System.Reflection.Assembly:LoadFrom( hm.Macro.Var['currentmacrodirectory'] .. "/TestSample.dll" ) local obj = clr.TestNameSpace.TestClass() -- clrに… result_num = obj.TestFuncNum(10) result_str = obj.TestFuncStr("あいう") hm.debuginfo(result_num) hm.debuginfo(result_str) 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['#rnum'] = result_max )MNG" ); message(str(#rnum)); freedll( #MNG ); 好きなフォルダに置くdllと.macつのファイルを好きなフォルダ(秀丸と一切関係ないフォルダでもよい)に置いて、 自作の個人的なディレクトリを、「.dll(アセンブリ)の置き場所」として認識させるアセンブリの.dllは本来配置場所が自由ではありません。
#MNG = loaddll( hidemarudir + @"\hmLN.dll" ); #_ = dllfuncw(#MNG, "DoString", R"MNG( -- C:\aaaというフォルダを追加。セパレータとなる「;」を忘れないこと!! package.path = "C:/aaa;" .. package.path -- 読み込めたら clr内にアセンブリとして読み込まれる -- clr.System.Reflection.Assembly:Load( "TestSample" ) を短く書いたもの。 load_assembly( "TestSample" ) local obj = clr.TestNameSpace.TestClass() -- clrに… result_num = obj.TestFuncNum(10) result_str = obj.TestFuncStr("あいう") hm.debuginfo(result_num) hm.debuginfo(result_str) 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['#rnum'] = result_max )MNG" ); freedll( #MNG ); |