3

を拡張するかなり複雑なクラスがありますSystem.Windows.Forms.UserControl/clrネイティブ C++ dll を使用するため、スイッチを使用して C++/CLI で記述されています。このクラスの主な役割は、テクスチャ、ズーム、パンなどで画像をレンダリングするアンマネージ Direct3D9 dll のラッパーとして機能することです。

このクラスを .NET Web アプリケーションで再利用する方法はありますか? つまり、ユーザー コントロールをブラウザー内で実行できるようにしたいと考えています。ここでの主な不確実性は、ネイティブ dll へのアクセスと、Direct3D の使用です。これを機能させることができるかどうかを確認するために小さなテストを設定していますが、他の誰かからの入力が必要です.

更新:このガイドに従いました。最初の試行で、コントロールの dll またはその依存関係の 1 つを読み込めないというエラーが表示されました。したがって、テストのために、使用するすべてのアンマネージ dll を system32 にコピーしました。エラーなしでページを読み込めるようになりましたが、まだコントロールが表示されません。About次のように、既定の C# Web アプリ プロジェクトのページに参​​照を配置しました。

<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 です。これは、ユーザー インターフェイス コンポーネントに WinForms ではなく WPF を使用します。WinForms コントロール用の WPF ホストがありますが、Silverlight 内から使用できるかどうかはわかりません。

また、Silverlight で C++/CLI を使用するには、一連の特別なコンパイル オプションが必要です。デフォルトでは、C++/CLI はブラウザ サンドボックスの外部で実行されるマシン固有のネイティブ コードを生成します。これは、適切なセキュリティ構成を持つユーザーによってブロックされます。純粋な MSIL コードを発行し、「部分信頼」を有効にする必要があります。次に、ラップしているネイティブ コンポーネントで問題が発生します。

Web ブラウザーでこれを行う利点はほとんどありません。ユーザーに 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

ちょっと考えてみてください。アンマネージ コードを呼び出す必要があるとします (このコードは、新しいユーザーの作成やハード ドライブのフォーマットなど、実行するユーザーが実行できるすべてのことを実行できます)。 Web ページで、任意のブラウザー (または少なくともほとんどのブラウザー) で動作する標準的なアプローチを使用したい場合。私の意見では、利用可能なものはありません。あなたが言ったように、window.GeckoActiveXObjectを介してMSIEとGeko(FireFox)の一部のバージョンでのみサポートされているOCXにフォールバックするか、FlashやSilverlightなどのより移植性の高いプラグインを使用する必要があります。 (または少なくともほとんどのプラットフォーム)ネイティブ関数呼び出しをそれらのプラグインで利用可能なものに置き換えます。

于 2012-10-01T15:39:38.040 に答える
1

C++/CLI は .NET 言語です。C# Web アプリケーション プロジェクトから使用する場合も簡単です。C++/CLI プロジェクトをクラス ライブラリ プロジェクト (DLL) としてコンパイルし、C# プロジェクトから参照を追加するだけです。

于 2012-09-27T13:21:35.557 に答える