一般論の話をしますと、「C#」「VB.net」「C++/CLI」「F#」「JScript.net」などで作成したdllを「マネージドなアセンブリdll」として読み込む場合、
普通なら「読み込み対象となるdllファイル置き場の位置に大きな制約」があるのです。(ネットなどで調べてみてください)
特殊な設定でもしない限り、「exeと同じ場所か、dll名と同じ名前のサブフォルダに入れる」必要があります。
しかし、hmPS・PowerShellにはそのような制限は一切ありません。
好きなフォルダに置いた自作のマネージドな.dllを(特に署名などもなく)突如自由に読みだして利用可能です。
最小限のサンプルとするため、わかりやすい構成としましょう。
hmPS/PowerShell自体は、.NET Framework 4.5で構成されていますが、
あなたが利用する.dllは、.NET Framework 4.7など、hmPSより新しいバージョンのアセンブリでも大丈夫です!!
ここも普通の.NETの考え方の制限とは大きく異なるとここです。
あなたのPCに入っている.NET Frameworkの一番新しいバージョンで作成しても問題ありません。
とします。
コンパイルし、TestSample.dllといった名前にしたとしましょう。
using System; namespace TestNameSpace { public class TestClass { public TestClass() { } public int TestFunc(int x) { return x + 3; } } }
PowerShellは、普通にユーザーが制作したC#を読み込めますので、適当に読み込めば良いでしょう。
ファイル名は、適当に「loaddlltest.mac」とでもしてみましょう。
#PS = loaddll( hidemarudir + "\\" + "hmPS.dll" ); #_ = dllfuncw(#PS, "DoString", R"PS( $AssemblyPath.Add( $hm::Macro::Var['currentmacrodirectory'] ) [System.Reflection.Assembly]::LoadWithPartialName("TestSample") $obj = New-Object TestNameSpace.TestClass $hm::debuginfo($obj); $total = $obj.TestFunc(10) $hm::Macro::Var['#total'] = $total; $hm::debuginfo($total) $hm::Macro::Eval( @' message(str(#total)); '@ ); )PS" ); // 解放 freedll(#PS);
以上、TestSample.dllとloaddlltest.macの2つのファイルを好きなフォルダ(秀丸と一切関係ないフォルダでもよい)に置いて、
「loaddlltest.mac」を適当に秀丸に登録して実行してみてください。
.dllが読みだされ計算結果がダイアログに表示されるハズです。
先述の例では、より正確な例を示すために、「$AssemblyPath.Add(...)」を使った例を示しました。
hmPSでは、実行するマクロファイルと同じ場所(currentmacrodirectory)に、読み込み対象の.dllがある場合、
$AssemblyPathにcurrentmacrodirectoryをAddする必要はありません。
以下のように簡潔な記述が可能です。
#PS = loaddll( hidemarudir + @"\hmPS.dll" ); #_ = dllfuncw( #PS, "DoString", R"PowerShell( [System.Reflection.Assembly]::LoadWithPartialName("TestSample") $obj = New-Object TestNameSpace.TestClass $hm::debuginfo($obj); $total = $obj.TestFunc(10) $hm::Macro::Var['#total'] = $total; $hm::debuginfo($total) $hm::Macro::Eval( @' message(str(#total)); '@ ); )PowerShell" ); freedll( #PS );