最終更新日 2024-09-25

C#などで作った外部の「マネージドな.dll」の読み込み

概要

一般論の話をしますと、「C#」「VB.net」「C++/CLI」「F#」「JScript.net」などで作成したdllを「マネージドなアセンブリdll」として読み込む場合、
普通なら「読み込み対象となるdllファイル置き場の位置に大きな制約」があるのです。(ネットなどで調べてみてください)
特殊な設定でもしない限り、「exeと同じ場所か、dll名と同じ名前のサブフォルダに入れる」必要があります。

しかし、hmPy・IronPythonにはそのような制限は一切ありません。
好きなフォルダに置いた自作のマネージドな.dllを(特に署名などもなく)突如自由に読みだして利用可能です。

C#のソースから.dllを作成。

最小限のサンプルとするため、わかりやすい構成としましょう。

hmPy/IronPython自体は、.NET Framework 4.0で構成されていますが、
あなたが利用する.dllは、.NET Framework 4.6など、hmPyより新しいバージョンのアセンブリでも大丈夫です!!
ここも普通の.NETの考え方の制限とは大きく異なるとここです。
あなたのPCに入っている.NET Frameworkの新しいバージョンで作成しても問題ありません。(但し4.8以下)

とします。

コンパイルし、TestSample.dllといった名前にしたとしましょう。

using System;

namespace TestNameSpace
{
    public class TestClass
    {
        public TestClass() { }
        public int TestFunc(int x)
        {
            return x + 3;
        }
    }
}

マクロファイルの置き場所(currentmacrodirectory)も「.dllの置き場」とみなしますので、
実行するマクロファイルと同じ場所に、読み込み対象の.dllがあるならば、
sys.path.append(currentmacrodirectory)といったことをする必要はありません。

もしも、対象の.dllがマクロファイルや秀丸ディレクトリとは異なる場所にあるのであれば、
sys.path.appendを利用して、対象のディレクトリを追加してください。

以下のように書けます

#PY = loaddll( hidemarudir + @"\hmPy.dll" );

#_ = dllfuncw(#PY, "DoString", R"IRONPYTHON(
import clr
clr.AddReferenceByPartialName("TestSample") # dllの名前を拡張子など抜きで

from TestNameSpace import *
obj = TestClass()         # オブジェクトの作成
result = obj.TestFunc(10) # dll内で3を足した値を返すので、結果は13
hm.debuginfo(result)

hm.Macro.Var['#num'] = result
hm.Macro.Eval(r"""
    message(str(#num));
""");

)IRONPYTHON"
);

freedll( #PY );

もしも、対象の.dllがマクロファイルや秀丸ディレクトリとは異なる場所にあるのであれば、
sys.path.appendを利用して、対象のディレクトリを追加してください。

以下のように書けます

#PY = loaddll( hidemarudir + @"\hmPy.dll" );

#_ = dllfuncw(#PY, "DoString", R"IRONPYTHON(
import clr

sys.path.append(r"C:/abc/mydir") # 独自の.dll置き場など

clr.AddReferenceByPartialName("TestSample") # dllの名前を拡張子など抜きで

from TestNameSpace import *
obj = TestClass()         # オブジェクトの作成
result = obj.TestFunc(10) # dll内で3を足した値を返すので、結果は13
hm.debuginfo(result)

hm.Macro.Var['#num'] = result
hm.Macro.Eval(r"""
    message(str(#num));
""");

)IRONPYTHON"
);

freedll( #PY );