我有一个非常复杂的类,它扩展了System.Windows.Forms.UserControl
。它使用/clr
开关在C ++ / CLI中编写,因为它使用本机C ++ dll。该类的主要职责是作为一个非托管Direct3D9 dll的包装器,它可以在纹理,缩放,平底锅等上呈现图像。
有没有办法在.NET Web应用程序中重用此类?换句话说,我想让我的用户控件在浏览器中运行。这里的主要不确定因素是对本机dll的访问以及Direct3D的使用。我正在设置一个小测试,看看我是否可以让它工作,但我想要别人的一些意见。
更新:我关注this guide。在第一次尝试时,我得到一个错误,说它无法加载控件的DLL或其依赖项之一。因此,仅仅为了测试,我将它使用的所有非托管dll复制到system32。现在我可以加载页面而不会出错,但我仍然无法看到控件。我将引用放在默认C#Web App项目的About
页面中,如下所示:
<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应用程序一样友好。
答案 0 :(得分:6)
runat="server"
不会让您的控件在浏览器中运行。我认为你对ASP.NET的工作原理有一个根本的误解。 Web控件不在浏览器中运行。它们在服务器上运行并生成发送到浏览器的HTML代码,可能包含各种HTML控件和Javascript片段。
HTML5(Javascript)以外的客户端代码的任何机制都需要客户端支持,即您试图避免使用的插件。在可能的插件中,最接近WinForms和最便携的插件将是Silverlight。对于用户界面组件,它使用WPF而不是WinForms。有一个用于WinForms控件的WPF主机,但我不知道你是否可以在Silverlight中使用它。
此外,您需要一堆特殊的编译选项才能在Silverlight中使用C ++ / CLI。默认情况下,C ++ / CLI会生成在浏览器沙箱外部运行的特定于计算机的本机代码。任何具有健全安全配置的用户都会阻止这种情况。您将需要发出纯MSIL代码并启用“部分信任”。然后你将遇到你正在包装的本机组件的麻烦。
在网络浏览器中执行此操作几乎没有任何优势。只需让用户下载WinForms应用程序即可。您可以使用ClickOnce或其他打包技术将应用程序更新到您站点上的最新版本,但是ASP.NET和任何浏览器技术都不能很好地与您的控件一起使用。你的另一个选择是重写,而不是包装器,而是整个OpenGL渲染层,改为使用WebGL。
答案 1 :(得分:2)
我不能说这是否适用于您的特定情况,但您可以尝试将其作为ActiveX加载。见:
http://www.codeproject.com/Articles/4953/Simple-way-to-expose-a-NET-WinForm-control-as-an-A
答案 2 :(得分:2)
想想它只是一秒钟,你想调用一个非托管代码(它可以完成任何运行它的用户可以做的事情,例如创建一个新用户,甚至可以格式化你的硬盘驱动器)在网页中运行并且您希望使用适用于任何浏览器(或至少大多数浏览器?)的标准方法。在我看来,没有这样的东西,你应该回退到OCX,正如你所说的只有MSIE和某些版本的Geko(FireFox)通过window.GeckoActiveXObject支持或者使用一个更便携的插件,如Flash或Silverlight,可以在任何(或至少在大多数平台上)并将这些本机函数调用替换为这些插件中可用的调用。
答案 3 :(得分:1)
C ++ / CLI是一种.NET语言,为什么不呢?如果您想要从C#Web应用程序项目中使用它,那也很简单,只需将C ++ / CLI项目编译为类库项目(DLL)并从C#项目添加对它的引用。