随分と前の続きです。題はアレですが、.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などで行き来するのが大変に楽です。

スポンサード リンク

この記事のカテゴリ

  • ⇒ .NET FrameworkのアンマネージAPI (3) AB.NET (CLR Hosting)
  • ⇒ .NET FrameworkのアンマネージAPI (3) AB.NET (CLR Hosting)
  • ⇒ .NET FrameworkのアンマネージAPI (3) AB.NET (CLR Hosting)