dar*_*mos 3 c++ web-applications c++-cli .net-4.0 direct3d9
我有一个相当复杂的课程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>
Run Code Online (Sandbox Code Playgroud)
我现在会尝试ActiveX方法,但即使这样可行,我想这会迫使我的客户使用Internet Explorer,或安装一些插件,不是吗?那真是太麻烦了.
编辑:到现在为止,我愿意尝试其他方法.例如,由于我的C++/CLI类只是一个包装器,我愿意在其他一些语言中编写另一个包装器.如果我这样做,该语言应尽可能与Web应用程序一样友好.
runat="server"不会让你的控件在浏览器中运行.我认为你对ASP.NET的工作原理有一个根本的误解.Web控件不在浏览器中运行.它们在服务器上运行并生成发送到浏览器的HTML代码,并且可能包含各种HTML控件和Javascript片段.
除HTML5(Javascript)之外的任何客户端代码机制都需要客户端支持,即您试图避免的插件.在可能的插件中,最接近WinForms和最便携的插件将是Silverlight.对于用户界面组件,它使用WPF而不是WinForms.有一个用于WinForms控件的WPF主机,但我不知道你是否可以在Silverlight中使用它.
此外,您需要一堆特殊的编译选项才能在Silverlight中使用C++/CLI.默认情况下,C++/CLI会生成在浏览器沙箱外部运行的特定于计算机的本机代码.任何具有健全安全配置的用户都会阻止这种情况.您将需要发出纯MSIL代码并启用"部分信任".然后你将遇到你正在包装的本机组件的麻烦.
在Web浏览器中执行此操作几乎没有任何优势.只需让用户下载WinForms应用程序即可.您可以使用ClickOnce或其他打包技术将应用程序更新到您站点上的最新版本,但ASP.NET和任何浏览器技术都不能很好地与您的控件一起使用.你的另一个选择是重写,而不是包装器,而是整个OpenGL渲染层,改为使用WebGL.