C#などで作った外部の「マネージドな.dll」の読み込み概要一般論の話をしますと、「C#」「VB.net」「C++/CLI」「F#」「JScript.net」などで作成したdllを「マネージドなアセンブリdll」として読み込む場合、 C#のソースから.dllを作成。最小限のサンプルとするため、わかりやすい構成としましょう。 hmPS/PowerShell自体は、.NET Framework 4.5で構成されていますが、
とします。 コンパイルし、TestSample.dllといった名前にしたとしましょう。 using System; namespace TestNameSpace { public class TestClass { public TestClass() { } public int TestFunc(int x) { return x + 3; } } } C#等のアセンブリをloadする例PowerShellは、普通にユーザーが制作したC#を読み込めますので、適当に読み込めば良いでしょう。 #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つのファイルを好きなフォルダ(秀丸と一切関係ないフォルダでもよい)に置いて、 currentmacrodirectoryはアセンブリの読み込み対象に入っている先述の例では、より正確な例を示すために、「$AssemblyPath.Add(...)」を使った例を示しました。 hmPSでは、実行するマクロファイルと同じ場所(currentmacrodirectory)に、読み込み対象の.dllがある場合、 以下のように簡潔な記述が可能です。 #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 ); |