3

我有一个非常复杂的类,它扩展了System.Windows.Forms.UserControl. 它是用带有开关的 C++/CLI 编写的/clr,因为它使用本机 C++ dll。该类的主要职责是充当非托管 Direct3D9 dll 的包装器,该 dll 在纹理、缩放、平移等上呈现图像。

有没有办法在 .NET Web 应用程序中重用这个类?换句话说,我想让我的用户控件在浏览器中运行。这里的主要不确定因素是对本机 dll 的访问以及 Direct3D 的使用。我正在设置一个小测试,看看我是否可以让它工作,但我想要其他人的一些输入。

更新:我遵循了本指南。在第一次尝试时,我收到一条错误消息,说它无法加载控件的 dll 或其依赖项之一。所以,只是为了测试,我将它使用的所有非托管 dll 复制到 system32。现在我可以毫无错误地加载页面,但我仍然看不到控件。About我在默认 C# Web App 项目的页面中放置了对它的引用,如下所示:

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <h2>
        About
    </h2>
    <p>
        Put content here.
    </p>
    <object id="MyWinControl1" height="200" width="200" classid="http:MNeoConsole.dll#MNeoConsole.MNeoConsoleControl">
        <param name="Title" value="Locura loca" />
        <param name="Visible" value="true" />
    </object>
</asp:Content>

我现在将尝试 ActiveX 方法,但即使可行,我想这也会迫使我的客户使用 Internet Explorer,或安装一些插件,不是吗?那真的很麻烦。

编辑:到目前为止,我愿意尝试其他方法。例如,由于我的 C++/CLI 类只是一个包装器,我愿意用其他语言编写另一个包装器。如果我这样做,该语言应该尽可能与 Web 应用程序友好。

4

4 回答 4

6

runat="server"不会让您的控件在浏览器中运行。我认为您对 ASP.NET 的工作原理存在根本性的误解。Web 控件不在浏览器内运行。它们在服务器上运行并生成发送到浏览器的 HTML 代码,并且可能包含各种 HTML 控件和 Javascript 片段。

除 HTML5 (Javascript) 之外的任何客户端代码机制都需要客户端支持,即您试图避免使用的插件。在可能的插件中,最接近 WinForms 和最便携的插件将是 Silverlight。对于用户界面组件,它使用 WPF,而不是 WinForms。WinForms 控件有一个 WPF 主机,但我不知道您是否可以在 Silverlight 中使用它。

此外,您需要一组特殊的编译选项才能将 C++/CLI 与 Silverlight 一起使用。默认情况下,C++/CLI 会生成在浏览器沙箱之外运行的特定于机器的本机代码。这将被任何具有合理安全配置的用户阻止。您将需要发出纯 MSIL 代码并启用“部分信任”。然后,您将在包装的本机组件上遇到麻烦。

在网络浏览器中执行此操作几乎没有任何优势。只需让用户下载一个 WinForms 应用程序。您可以使用 ClickOnce 或其他打包技术将应用程序更新到您站点上的最新版本,但是 ASP.NET 和任何浏览器技术都不能很好地与您的控件配合使用。您的另一个选择是重写,而不是包装器,而是整个 OpenGL 渲染层,以使用 WebGL。

于 2012-09-30T15:28:35.940 回答
2

我不能说这是否适用于您的特定场景,但您可以尝试将其加载为 ActiveX。看到这个:

http://www.codeproject.com/Articles/4953/Simple-way-to-expose-a-NET-WinForm-control-as-an-A

于 2012-09-27T13:14:08.327 回答
2

想一想,您想从运行在网页,并且您想使用适用于任何浏览器(或至少大多数浏览器?)的标准方法。在我看来,没有这样的东西可用,你应该回退到 OCX,正如你所说,只有 MSIE 和某些版本的 Geko(FireFox)通过 window.GeckoActiveXObject 支持,或者使用更便携的插件,如 Flash 或 Silverlight 可以在任何(或至少大多数平台)并将您的本机函数调用替换为那些插件中可用的函数调用。

于 2012-10-01T15:39:38.040 回答
1

C++/CLI 是一种 .NET 语言,为什么不呢?如果您的意思是要从 C# Web 应用程序项目中使用它,那也很简单,只需将 C++/CLI 项目编译为类库项目(DLL)并从 C# 项目中添加对它的引用。

于 2012-09-27T13:21:35.557 回答