gpt4 book ai didi

c# - .NET2.0 C# 互操作 : How to call COM code from C#?

转载 作者:行者123 更新时间:2023-11-30 14:21:00 25 4
gpt4 key购买 nike

在我上一个开发环境中,我能够轻松地与 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 是一个后期绑定(bind)的 IDispatch。我们在我们和我们客户的机器上使用 Visual Studio 2005 和 .NET 2.0。

那么在某种程度上仅支持后期绑定(bind) IDispatch 的对象上调用方法的 .NET 2.0 方法是什么?

快速搜索 Stack Overflow 以使用 C# 中的 IDispatch 出现 this post在 .NET 中说出我想要的是不可能的。

那么是否可以从 C# .NET 2.0 使用 COM?


问题是我想在 C#/.NET 中使用一个公认的设计模式。它涉及在进程外启动 Internet Explorer,并为其提供 HTML 内容,同时不使用临时文件。

一个被拒绝的设计想法是在 WinForm 上托管 Internet Explorer。

一个可接受的替代方案是启动系统注册的网络浏览器,为其提供 HTML 以显示,而不使用临时文件。

障碍是继续在 .NET 世界中使用 COM 对象。具体问题涉及在不需要 C# 4.0 的情况下执行对 IDispatch 的后期绑定(bind)调用。 (即使用 .NET 2.0 时)

最佳答案

Update: Based on question updates, I have removed the portions of my answer that are no longer relevant to the question. However, in case other readers are looking for a quick and dirty way to generate HTML in a winforms app and do not require an in-process IE, I will leave the following:

可能的场景 1:最终目标是简单地向您的最终用户显示 HTML 并使用 Windows 窗体

System.Windows.Forms.WebBrowser 是您尝试手动实现的接口(interface)的非常简单的 .NET 包装器。要获取它,请将该对象的一个​​实例从您的工具栏(在“所有 Windows 窗体”部分下列为“Web 浏览器”)拖放到您的窗体上。然后,在一些合适的事件处理程序上:

webBrowser1.Navigate("about:blank");
webBrowser1.Document.Write("<html><body>Hello World</body></html>");

在我的测试应用中,这正确地显示了我们都已经学会害怕和厌恶的令人难以忘怀的信息。

关于c# - .NET2.0 C# 互操作 : How to call COM code from C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/469802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com