随分と前の続きです。題はアレですが、.NETのアンマネージAPIを使ってプロセスにCLRを読み込むところまではABでできたので,とりあえずコード(例によって.NET Framework 1.x用)です。
Sub Main()
Dim host = Nothing As ICorRuntimeHost
Dim hr = CorBindToRuntimeEx(ToWCStr("v1.1.4322"), 0, 0, CLSID_CorRuntimeHost, IID_ICorRuntimeHost, host)
if (FAILED(hr)) Then
Debug
Exit Sub
End If
host.Start()
Dim unkAppDomain = Nothing As IUnknown
hr = host.GetDefaultDomain(unkAppDomain)
host.Release()
If (FAILED(hr)) Then
Debug
Exit Sub
End If
Dim appDomain = Nothing As _AppDomain
hr = unkAppDomain.QueryInterface(IID__AppDomain, appDomain)
unkAppDomain.Release()
If (FAILED(hr)) Then
Debug
Exit Sub
End If
Dim objHandle = Nothing As _ObjectHandle
Dim asmPath = New BString("C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\mscorlib.dll")
Dim typeName = New BString("System.Collections.ArrayList")
hr = appDomain.CreateInstanceFrom(
asmPath.BStr,
typeName.BStr,
objHandle)
appDomain.Release()
If (FAILED(hr)) Then
Debug
Exit Sub
End If
End Sub
Main()
ListSample関数がうまくうごかなかったので、ここまでです。ほかにインタフェースなどの宣言が必要ですが、数百行にもわたるため、省略します。その内、ファイルを公開するつもりです。
デバッグ実行すると、mscorlib.dllが読み込まれていることが分かります。ただそれだけですが。
このようにネイティブプログラム内からCLRを読み込む(ホストしてやる)と、リフレクションAPIを使って自由にマネージコードを呼び出せる(COM経由と違って引数有りコンストラクタ、静的メンバ、ジェネリックも使用可)、マネージプログラムのメモリ、スレッドなどの制御を行えるという特徴があります。実例としては、IIS 6.0 (ASP.NET), SQL Server 2005 (ストアドプロシージャ)などがあり、マネージコードを(どちらかというと)プラグイン的に組み込むために使われています。
結局のところ、ホストする側は、ただのアプリケーションプログラマにとってかなり縁のない機能なのでした。単にマネージとネイティブの間を行き来したければ、COMやC++/CLIなどで行き来するのが大変に楽です。
スポンサード リンク |