У меня довольно сложный класс, который расширяет System.Windows.Forms.UserControl
, Он написан на C ++ / CLI с /clr
переключатель, потому что он использует родные C ++ DLL. Основная ответственность класса — выступать в роли оболочки для неуправляемой DLL-библиотеки Direct3D9, которая отображает изображения поверх текстур, масштабов, панелей и т. Д.
Есть ли способ повторно использовать этот класс в веб-приложении .NET? Другими словами, я хочу, чтобы мой пользовательский элемент управления запускался внутри браузера. Основными неопределенностями здесь являются доступ к родным dll и использование Direct3D. Я настраиваю небольшой тест, чтобы увидеть, смогу ли я заставить это работать, но я хотел бы получить информацию от кого-то еще.
Обновить: Я последовал за это руководство. С первой попытки я получил сообщение о том, что он не может загрузить dll элемента управления или одну из его зависимостей. Итак, просто для тестирования я скопировал все неуправляемые dll, которые он использует, в system32. Теперь я могу загрузить страницу без ошибок, но все еще не вижу элемент управления. Я поместил ссылку на это в About
страница из проекта веб-приложения C # по умолчанию, например:
<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 является просто оболочкой, я хочу написать еще одну оболочку в другом языке. Если я пойду по этому пути, этот язык должен быть максимально дружественным к веб-приложениям.
runat="server"
не собирается заставить ваш контроль работать внутри браузера. Я думаю, у вас есть фундаментальное недопонимание того, как работает ASP.NET. Веб-элементы управления не работают внутри браузера. Они запускаются на сервере и генерируют HTML-код, который отправляется в браузер, и могут включать в себя различные элементы управления HTML и фрагменты Javascript.
Любой механизм для кода на стороне клиента, кроме HTML5 (Javascript), потребует поддержки на стороне клиента, то есть плагина, который вы пытались избежать. Из возможных плагинов наиболее близким к WinForms и наиболее переносимым будет Silverlight. Это использует WPF, а не WinForms, для компонентов пользовательского интерфейса. Существует узел WPF для элементов управления WinForms, но я не знаю, можете ли вы использовать его из Silverlight.
Кроме того, вам нужно несколько специальных параметров компиляции, чтобы использовать C ++ / CLI с Silverlight. По умолчанию C ++ / CLI генерирует машинный нативный код, который запускается вне изолированной программной среды браузера. Это будет заблокировано любым пользователем с нормальной конфигурацией безопасности. Вам нужно будет выдать чистый код MSIL и включить «Частичное доверие». Тогда у вас возникнут проблемы с нативным компонентом, который вы упаковываете.
Там практически нет преимуществ делать это в веб-браузере. Просто попросите пользователя загрузить приложение WinForms. Вы можете использовать ClickOnce или другую технологию упаковки, чтобы обновлять приложение до последней версии на своем сайте, но ни ASP.NET, ни какая-либо из технологий браузеров не будут хорошо работать под вашим контролем. Другой вариант — переписать не оболочку, а весь слой рендеринга OpenGL, чтобы использовать вместо него WebGL.
Я не могу сказать, сработает ли это в вашем конкретном сценарии, но вы можете попробовать загрузить его как ActiveX. Видеть это:
http://www.codeproject.com/Articles/4953/Simple-way-to-expose-a-NET-WinForm-control-as-an-A
Подумайте об этом на секунду, вы хотите вызвать неуправляемый код (который может делать ровно все, что может выполнить пользователь, выполняющий его, например, создать нового пользователя или даже отформатировать жесткий диск) из элемента управления, который выполняется в веб-страницу, и вы хотите использовать стандартный подход, который работает с любым браузером (или, по крайней мере, большинство из них?). по моему мнению, такой вещи нет, вам следует использовать OCX, который, как вы сказали, поддерживается только MSIE и некоторыми версиями Geko (FireFox) через window.GeckoActiveXObject или использовать более переносимый плагин, такой как Flash или Silverlight, который работает на любом (или, по крайней мере, на большинстве платформ) и замените ваши собственные вызовы функций на те, которые доступны в этих плагинах.
C ++ / CLI — это язык .NET, так почему бы и нет? Если вы имеете в виду, что хотите использовать его из проекта веб-приложения C #, это также просто, просто скомпилируйте проект C ++ / CLI как проект библиотеки классов (DLL) и добавьте ссылку на него из проекта C #.