.NET2.0 C# Interop: Comment appeler COM de code C#?

Dans mon dernier environnement de développement, j'ai été en mesure d'interagir facilement avec COM, des appels de méthodes sur des objets COM. Voici le code d'origine, traduit en C# code de style (pour masquer la langue d'origine):

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;
}

Maintenant commence le pénible, douloureuse, d'essayer de l'interopérabilité avec les COM de code managé.

PInvoke.net contient déjà les IWebBrower2 traduction, la ème porition de ce qui est:

[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; }
}

J'ai créé la classe COM:

[ComImport]
[Guid("0002DF01-0000-0000-C000-000000000046")]
public class InternetExplorer
{
}

Alors maintenant il est temps pour mon C# transaction:

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;
}

L'attention des lecteurs remarquez que IWebBrowser2.Le Document est une tardive IDispatch.
Nous sommes à l'aide de Visual Studio 2005, avec .NET 2.0 sur notre et celui de nos clients, des machines.

Alors, quelle est la .NET 2.0 de la méthode à appeler des méthodes sur un objet qui, à un certain niveau, prend uniquement en charge tardive IDispatch?

Une recherche rapide d'un Débordement de Pile pour l'utilisation de IDispatch à partir de C# tourne ce post dire ce que je veux, c'est pas possible .NET.

Ainsi est-il possible d'utiliser COM à partir de C# .NET 2.0?


La question est qu'il y est un motif de conception que je veux utiliser en C#/.NET. Il implique le lancement d'Internet Explorer en dehors du processus, et en lui donnant un contenu HTML, tout en n'utilisant pas les fichiers temporaires.

A rejeté l'idée de conception est de l'hébergement Internet Explorer sur un WinForm.

Une alternative acceptable est de lancer le système enregistré navigateur web, lui donnant un code HTML permettant d'afficher, sans l'aide d'un fichier temporaire.

La pierre d'achoppement est de continuer à utiliser les objets COM dans le .Monde NET. Le problème consiste en la réalisation d'une liaison tardive appels IDispatch sans avoir besoin de C# 4.0. (c'est à dire lors de l'utilisation .NET 2.0)

Par curiosité, quel est l'objectif global? Il semble que vous êtes désireux de lancer IE, puis d'afficher le code HTML de la chaîne passée. Est-il nécessaire que vous lancez IE plus précisément, et non pas le Système.De Windows.Les formulaires.Contrôle WebBrowser?
Pouvez-vous le Système de lancement.De Windows.Les formulaires.WebBrowser de processus?
J'imagine que cela peut être fait, mais je n'ai pas fait moi-même. Si je reçois quelque chose à travailler, je vais poster en arrière.
Si vous réussissez à le faire (sans faire référence à l'assembly PIA), vous obtiendrez un humide bâclée baiser.

OriginalL'auteur Ian Boyd | 2009-01-22