.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)
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
Vous devez vous connecter pour publier un commentaire.
Possible Scénario 1: Le but ultime est de simplement afficher le code HTML de votre utilisateur final et sont à l'aide de Windows Forms
System.Windows.Forms.WebBrowser
est minutieusement facile .NET wrapper pour l'interface que vous essayez de mettre en œuvre manuellement. Pour l'obtenir, faites Glisser une occurrence de l'objet à partir de votre barre d'outils (répertorié comme "Navigateur Web" sous la rubrique "Tous les Windows Forms") sur votre formulaire. Puis, sur certains approprié gestionnaire d'événement:Sur mon appli de test, cette affiche correctement la hantise message nous avons tous appris à le craindre et de la réticence.
Scénario 1: a laisser de la place pour mon erreur d'interprétation. Fondamentalement, j'ai eu connaissance de l'un des ".NET les moyens" de le faire. Je ne pouvais pas dire à partir de la question initiale de savoir si vous A. voulais juste simplement résoudre l'affichage html, ou si B. c'était juste un exemple du problème plus vaste. Il semble que c'était B.
j'aime utiliser de SORTE à obtenir des réponses à des questions d'ordre conceptuel, plutôt que sur des cas précis.
Compris. Il semble en fait comme quelque chose qui se passe beaucoup de choses, DONC: l'Ambiguïté entre un plus haut niveau conceptuel, à l'approche de la question qui utilisent un scénario comme un exemple, et des questions sur des questions très spécifiques. Je pense que c'est une bonne distinction de savoir. Merci pour vos commentaires.
OriginalL'auteur el2iot2
Tardive IDispatch appelé est en facile .NET, bien que les pisse-pauvres:
Référencés DONC, la question qui, à l'origine dit "pas possible jusqu'à ce que C# 4.0" a été modifié de façon à montrer comment il est possible, dans .NET 2.0.
Est-Ce Que C# .NET charge IDispatch la liaison tardive?
OriginalL'auteur Ian Boyd
Les réponses dans le post en lien sont en fait incorrect. Il est généralement très facile à gérer avec IDispatch de base des objets .Net. Fondamentalement, vous allez à travers trois étapes:
La plupart des objets automation (probablement plus de 90%) qui sont exposées comme des interfaces IDispatch avoir d'autres interfaces qui peuvent être utilisées par des non-script type COM clients (soit l'interface IDispatch, est en fait un COM interface dérivé de IDispatch ou de l'objet prend en charge un ou plusieurs autres IUnknown dérivé des interfaces). Dans ce cas, il vous suffit d'importer le COM approprié définition de l'interface, puis de convertir l'objet à l'interface appropriée. La distribution des appels QueryInterface sous les couvertures et renvoie un enveloppé de référence pour l'interface que vous souhaitez.
C'est la technique que vous devez utiliser dans le scénario présenté ci-dessus. L'objet Document est retourné à partir de l'IE objet automation prend en charge la IHTMLDocument, IHTMLDocument2, IHTMLDocument3, IHTMLDocument4 et IHTMLDocument5 interfaces (en fonction de la version d'internet explorer que vous utilisez). Vous devez convertir à l'interface appropriée, puis d'appeler la méthode appropriée. Par exemple:
Dans les rares cas où l'objet automation ne prend pas en charge une interface de rechange. Ensuite, vous devez utiliser VB.Net pour l'envelopper de cette interface. Avec l'Option Strict réglé sur off (pour la classe wrapper uniquement) vous pouvez utiliser VB de la prise en charge intégrée de retard lié à des appels de simplement appeler les méthodes IDispatch sous les couvertures. Dans de rares cas, avec des types d'argument, vous pouvez avoir besoin de jouer un peu avec l'appel, mais, en général, dans visual basic, vous pouvez juste faire il! Même avec la dynamique des ajouts de C# v4 VB, il faudra probablement avoir nettement mieux en charge tardive des appels COM.
Si pour quelque raison vous ne pouvez pas utiliser visual basic pour envelopper l'interface d'automatisation, vous pouvez toujours effectuer les appels à partir de C# à l'aide de la réflexion. Je n'entrerai pas dans les détails car cette option devrait jamais être utilisée, mais ici, c'est un petit exemple impliquant la bureautique.
j'ai découvert le en moyen facile d'appel tardive IDispatch en fonction des interfaces en C#.
OriginalL'auteur Stephen Martin
Voir cet article :
http://www.codeproject.com/KB/cs/IELateBindingAutowod.aspx
Internet Explorer Liaison Tardive D'Automatisation
Par yincekara
Internet Explorer automatisation exemple de code utilisant la liaison tardive, sans Microsoft.mshtml et shdocvw dépendance.
pour htmlDoc.écrire(htmlString);
modifier
OriginalL'auteur