2012-09-12 12 views
10

ここでは、MvcWebRazorHostFactoryを拡張してビルド時に余分なビューを行うことができます。正確な魔法は関係ありません。私の〜\ビューでカスタムホストでRazorの構文を強調表示するVisual Studioを入手するfactoryType

登録\のWeb.configはそうのようになります。

<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace" /> 

あり\ libフォルダ内のアセンブリのコピーは、プロジェクト内の適切なアセンブリにだ、と私はしました期待どおりに\ binにコピーされていることを確認しました。さらに、実際のビューマジックは、ビューが作成されるときにが発生するので、ASP.NET自体が実際にすべてを見つけるようになります。

Visual Studio(2012)のRazorで動作しないもの構文ハイライト。上記

enter image description here

シンタックスハイライトが失敗したかのスナップショットです。原則として、名前空間に直接ないものは@using 'dが見つかりません(したがって、赤い波状の下線が引かれます)。@modelディレクティブは機能しません。これは、Web.configのautomatically included namespacesに問題があることを示しています。

@modelのエラーのヒントは、「現在のコンテキストには名前のモデルが存在しません」というメッセージが表示されます。

試行錯誤を経て、上記のhost設定セクションの根本的な原因を絞りましたが、Razor(カスタムpageBaseTypeなど)の周りにはいくつかの調整がありますが、それはすべてを破るその1行です。

物事私がこれまで試してみた:

  • 強いが、これは必要なことでGAC
    • This pageヒントにアセンブリーの取り付けアセンブリ
    • に名前を付けます。

強く名前の私の〜\は\ Web.configファイルがそうのように見えることになったビュー時:

<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b61d663b67b05bd2" /> 

私は「ます。gacutil -lを使用してGACに対してバージョン、文化、となPublicKeyTokenをチェックします"

私の箱に.NETバージョンがたくさんあるので、もう1つの可能性のある障害ポイントはGAC自体です。アセンブリとWebサイトの両方は、.NET 4.5(両方ともMVC 4、Razor 2などを参照)で構築されています。デバッグ中に使用していたgacutilへのパスはProgram Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\gacutil.exeです。

ときどき根本原因に気づいているうちに、ビューの最初の行に "StackExchange.MyNamespace.MyFactoryが見つかりませんでした"というエラーメッセージが表示されることがありました。下線は「その他のエラー」色(紫色のVS2012の紫色)になります。私はそれを確実に再現することができませんでしたので、スクリーンショットを取得できません。


だから私の質問は、誰もが適切にカスタムホスト工場でカミソリビューを処理するためのVisual Studio(再び2012)を取得する方法を知っているんですか?

修正中の私の現在の最高の推測は、編集中に1つの設定とデバッグ中に1つの設定を持つように、いくつかの本当にハックなWeb.configの置き換えを行っています。本当にそのアイデアのファンではありません。

これはうまくいくはずですが、Visual Studioはただ必要なものを見つけるのに苦労しているようです。私はそれが何であるか分かりません。


さらにいくつかの実験を行ってから更新します。

バニラMVC4アプリケーションを含む<host pageFactoryType="...">であることを再現する開発者が増えています(上記の例は、明らかにStackOverflowソリューションの一部です)。

私たちは回避策を見つけました。それはReSharperのライセンスを購入することです。偉大な(または安い)回避策ではなく、少ないものの周りの仕事。

ReSharperをインストールすると、すべてが1つの注意書きで動作します。カスタム<pages pageBaseType="...">の登録がある場合、タイプである必要があります。@this.Modelの参照ではインテリセンスを得られません(@modelディレクティブは機能します)。


その他のアップデート。

はノーオペレーションのHostFactory(MvcRazorHostFactoryを拡張するが、任意のメソッドをオーバーライドしたり、他のコードが含まれていない1)のように見えます正常に動作あなた厳密な名前をし、GACにインストール場合。私はそれを以前のテストで間違ったGACを使用していたと信じていましたが、(いくつかの外部からの突発的な結果で)明示的にx64 gacutilを使って動作させることができました。

問題は、私の特定のホストファクトリで何が問題なのかを把握することです。彼らが発見されるにつれて詳細が来る。

答えて

6

マイクロソフトといくつかの話し合いをしたところ、この問題の根本的な原因がわかりました。

As usual, it was my code

プロジェクト(およびその周辺のすべて)がMVC4であるにもかかわらず、カスタムfactoryTypeのルートエラーがMVC3参照でした。

すべてをまとめて、Visual Studio IntelliSenseが動作するようにします。カスタム<host factoryType>とCSHTMLファイル:

  • あなたは厳密な名前をする必要がありますアセンブリ
  • あなたは我々はまだローカルコピーに対して、デバッグおよび展開GAC
    • にアセンブリをインストールする必要がありますが、VSは中になりますあなたは必見はすべての権利の参照を持っているGAC
  • *

GACにインストールした後でVisual Studioを再起動する必要があることに注意してください。単にソリューションを再ロードするだけでは(通常は)十分ではありません。また、ReSharperの一部のインストール(すべてではありません)では、安全な側にキャッシュをクリアするために、キャッシュをクリアする必要があることがわかりました。

GACにあるアセンブリへの参照を追加すると、Visual Studioは既定で出力ディレクトリにコピーされませんが、これは問題なく動作します。これは、参照のプロパティで変更することができます。

enter image description here

カスタムファクトリが例外をスローした場合も、Visual Studioのあなたの数のエラー・メッセージ(私は確実に以前を再現することができませんでした「その他のエラー」紫の下線)を与えます。おそらくそのコンストラクタ(少し矛盾しているように見える)を除いて。

ここでは、タイプ自体に重大な問題がある場合があります。実行時に問題が起こったのは偶然のことでした(MVC3とMVC4の間ではインターフェースが変わらず、残りの部分は弱い命名でした)。

※MVCベータ1〜4がインストールされている場合は、この手順でPEBKACに注意してください。

関連する問題