В моей последней среде разработки я мог легко взаимодействовать с 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 , относительная часть которого:
[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 на наших и наших клиентских компьютерах.
Так что же такое метод .NET 2.0 для вызова методов объекта, который на каком-то уровне поддерживает только IDispatch с поздней привязкой?
Появляется быстрый поиск переполнения стека для использования IDispatch из C # в этом посте о том, что я хочу, невозможно .NET.
Так можно ли использовать COM из C # .NET 2.0?
Вопрос в том, что есть принятый шаблон проектирования, который я хочу использовать в C # / .NET. Он включает запуск Internet Explorer вне процесса и предоставление ему содержимого HTML, при этом временные файлы не используются.
Отклоненной идеей дизайна является размещение Internet Explorer на WinForm.
Приемлемой альтернативой является запуск зарегистрированного в системе веб-браузера с отображением HTML-кода без использования временного файла.
Камнем преткновения продолжает использование COM-объектов в мире .NET. Конкретная проблема заключается в выполнении вызовов поздней привязки к IDispatch без использования C # 4.0. (т.е. при использовании .NET 2.0)