前回の開発環境では、COM オブジェクトのメソッドを呼び出して、COM と簡単に対話することができました。C# スタイル コードに変換された元のコードを次に示します (元の言語をマスクするため)。
public static void SpawnIEWithSource(String szSourceHTML)
{
OleVariant ie; //IWebBrowser2
OleVariant ie = new InternetExplorer();
ie.Navigate2("about:blank");
OleVariant webDocument = ie.Document;
webDocument.Write(szSourceHTML);
webDocument.close;
ie.Visible = True;
}
ここで、マネージ コードから COM との相互運用を試みる、面倒で骨の折れるプロセスが始まります。
PInvoke.net には既にIWebBrower2 translationが含まれており、その関連部分は次のとおりです。
[ComImport,
DefaultMember("Name"),
Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch),
SuppressUnmanagedCodeSecurity]
public interface IWebBrowser2
{
[DispId(500)]
void Navigate2([In] ref object URL, [In] ref object Flags, [In] ref object TargetFrameName, [In] ref object PostData, [In] ref object Headers);
object Document { [return: MarshalAs(UnmanagedType.IDispatch)] [DispId(0xcb)] get; }
}
COM クラスを作成しました。
[ComImport]
[Guid("0002DF01-0000-0000-C000-000000000046")]
public class InternetExplorer
{
}
それでは、実際の C# トランザクションの時間です。
public static void SpawnIEWithSource(String szHtml)
{
PInvoke.ShellDocView.IWebBrowser2 ie;
ie = (PInvoke.ShellDocView.IWebBrowser2)new PInvoke.ShellDocView.InternetExplorer();
//Navigate to about:blank to initialize the browser
object o = System.Reflection.Missing.Value;
String url = @"about:blank";
ie.Navigate2(ref url, ref o, ref o, ref o, ref o);
//stuff contents into the document
object webDocument = ie.Document;
//webDocument.Write(szHtml);
//webDocument.Close();
ie.Visible = true;
}
注意深い読者は、IWebBrowser2.Document が遅延バインド IDispatch であることに気付きます。私たちは Visual Studio 2005 を使用し、.NET 2.0 を私たちのマシンと顧客のマシンで使用しています。
では、あるレベルでレイト バインド IDispatch のみをサポートするオブジェクトのメソッドを呼び出す .NET 2.0 メソッドは何でしょうか?
C# から IDispatch を使用するために Stack Overflow をすばやく検索すると、この投稿が表示され、私が望むことは .NET では不可能であると書かれています。
C# .NET 2.0 から COM を使用することは可能ですか?
問題は、C#/.NET で使用したい、受け入れられているデザイン パターンがあるかどうかです。Internet Explorer をアウト プロセスで起動し、HTML コンテンツを提供しますが、一時ファイルは使用しません。
却下された設計案は、WinForm で Internet Explorer をホストすることです。
受け入れ可能な代替手段は、一時ファイルを使用せずに、表示する HTML を指定して、システムに登録された Web ブラウザーを起動することです。
つまずきは、.NET の世界で引き続き COM オブジェクトを使用することです。具体的な問題には、C# 4.0 を必要とせずに IDispatch への遅延バインディング呼び出しを実行することが含まれます。(つまり、.NET 2.0 を使用している場合)