WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

VS2010 によるエラーチェック

by WebSurfer 2016年7月2日 15:48

Visual Studio によるエラーチェックは Web サイトプロジェクトと Web アプリケーションプロジェクトでは異なるという話を書きます。

VS2010 エディタのエラーチェック

自分の環境(Vista SP2 32-bit, Visual Studio 2010 Professional)で検証した結果をまとめると以下のようになりました:

  1. Web サイトプロジェクト
    設定したターゲットフレームワークに応じた言語バージョンに準拠(FW3.5 なら C# 3 または VB9.0、FW4 なら C# 4 または VB10.0)
  2. Web アプリケーションプロジェクト
    Visual Studio に採用された言語バージョンに準拠(VS2010 なら C# 4 または VB10.0)

これは、基本的にソースコードのままサーバーにデプロイしてサーバー側で動的にコンパイルを行う Web サイトプロジェクトと、Visual Studio で単一アセンブリ (.dll) にコンパイルして出来上がった .dll をサーバーにデプロイする Web アプリケーションプロジェクトとの違いからきていると思われます。

言語に C# を使って検証した場合の具体的な結果を以下に書いておきます。

(1) Web サイトプロジェクト

MSDN ライブラリの記事「What's New for Visual C#」によると、VS2010 の C# の言語バージョンは C# 4 で、Dynamic、名前付き引数と省略可能なパラメーター、ジェネリックの共変性/反変性が新機能としてサポートされたとのことです。

なので、名前付き引数を使ったメソッドをターゲットフレームワーク 3.5 の Web サイトプロジェクトのコードビハインドに実装して VS2010 によるエラーチェックがどうなるかを見てみました。

その結果が一番上の画像です。エディタレベルで VS2010 のエラーチェックに引っかかり、「3.0 C# 言語使用の一部ではないため、機能 '名前付き引数' を使用することはできません。」というエラーメッセージが出ています。

Visual Studio 上でビルドをかけると、[エラー一覧]にエラーが表示され(エディタレベルのエラーメッセージとは異なりますが)、ビルドに失敗します。もちろん実行はできません。

ブラウザのアドレスバーに直接 URL を入力して、ブラウザから問題のページを要求すると、サーバー側での動的コンパイルでコンパイルエラーとなり、以下の画像のサーバーエラーが応答として返ってきます。

動的コンパイルでのエラー

これは web.config で、サーバー側で動的コンパイルに使うコンパイラが以下のように設定されており、これに従って C:\Windows\Microsoft.NET\Framework\v3.5 にあるコンパイラ csc.exe(自分の環境では製品バージョン 3.5.307129.1・・・名前付き引数はサポートしていない)が使用されるためです。

<system.codedom>
  <compilers>
    <compiler 
      language="c#;cs;csharp" 
      extension=".cs" 
      warningLevel="4"
      type="Microsoft.CSharp.CSharpCodeProvider, System, 
            Version=2.0.0.0, 
            Culture=neutral, 
            PublicKeyToken=b77a5c561934e089">
      <providerOption name="CompilerVersion" value="v3.5"/>
      <providerOption name="WarnAsError" value="false"/>
    </compiler>
 </compilers>
</system.codedom>

同じコードをターゲットフレームワークが 4 の Web サイトプロジェクトに実装すれば、当然ながらエラーメッセージ等は一切出ず、ビルドも実行も問題ありません。

(2) Web アプリケーションプロジェクト

上記 (1) と同じコードをターゲットフレームワーク 3.5 の Web サイトプロジェクトのコードビハインドに実装してみます。動的コンパイルに使うコンパイラの設定(web.config の system.codedom 要素の設定)は上の (1) Web サイトプロジェクトの場合と同じです。

結果、上記 (1) Web サイトプロジェクトの時のようなエディタ上のエラーは出ません。ビルドも通りますし、実行上も問題ありません。

ということは、ターゲットフレームワークの設定には関係なく、VS2010 に採用された言語バージョン C# 4 をベースに VS2010 のエディタ上でエラーチェックが行われ、ビルドも言語バージョン C# 4 のコンパイラで行われているということになります。

では、動的コンパイルが行われる部分はどうでしょうか?(Web アプリケーションプロジェクトでも .aspx ファイルや App_Code のソースなどはデフォルトではサーバー側で動的コンパイルが行われます)

まず、.aspx ファイルに以下のようなコードブロック(<% から %> までのコード)を実装してみます。

<body>
  <form id="form1" runat="server">
  <div>
    <asp:Label ID="Label1" runat="server"></asp:Label>
    <br />
    <% =CalculateBMI(height: 64, weight: 123) %>
  </form>
</body>

そうすると、エディタレベルで一番上と同様なエラーが表示されます。ただし、コードブロックの部分は Visual Studio ではコンパイルされないためか、ビルドは通ります。実行したりブラウザから要求をかけた場合は動的コンパイルが行われ、コードブロックの部分でコンパイルエラーとなり、上の 2 つ目の画像と同様なサーバーエラーとなります。

次に、App_Code に以下のようなクラスファイルを実装してみます。クラスファイル Class1.cs のビルドアクションは「コンテンツ」「コンパイル」いずれの場合もエディタレベルではエラーは表示されません。ビルドも通ります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Framework35CSharp.App_Code
{
  public class Class1
  {
    public int CalculateBMI(int weight, int height)
    {
      return (weight * 703) / (height * height);
    }

    public string BMI64x123()
    {
      return CalculateBMI(height: 64, weight: 123).ToString();
    }
  }
}

2 重コンパイルの問題を避けるためにクラスファイル Class1.cs のビルドアクションは「コンテンツ」として実行してみます。するとサーバー側で動的コンパイルが行われ、名前付き引数を使っているところでコンパイルエラーとなり、上の 2 つ目の画像と同様なサーバーエラーとなります。ブラウザから要求をかけた場合も同様にサーバーエラーが返ってきます。(ビルドアクションを「コンパイル」にしても同様に動的コンパイルでエラーになります)

元は MSDN Forum の「ASPNET WEBサイト(VB)で、yieldが使用できない」という表題のスレッドでの話で、VB.NET の場合の検証結果はそちらに書きましたが若干様子が異なります。

また、そのフォーラムに VS2012 / 2013 では Web アプリケーションプロジェクトの App_Code フォルダでもエディタによるエラーチェックは働くという話があります。Visual Studio のバージョンによって異なるのかもしれません。(自分は検証できる環境を持ってないので未確認ですが)

Tags: ,

ASP.NET

VS2010 で ASP.NET MVC 4

by WebSurfer 2014年7月14日 14:30

何を今さらと言われるるかもしれませんが、VS2010 でも ASP.NET MVC 4 を使用しての開発ができるということを知って、自分の開発マシンにもインストールしてみました。

VS2010 で ASP.NET MVC 4

実は、MVC4 は VS2012 以上でなければサポートされてないと誤解しており、VS2012 はシステム要件が Windows 7 以上ということで(自分の開発マシンの OS は Vista)諦めてました。(汗)

Visual Studio 2012 / ASP.NET MVC 4 正式リリース というブログに書いてあった Microsoft のダウンロードサイト Visual Studio 2010 SP1 および Visual Web Developer 2010 SP1 用 ASP.NET MVC 4 から AspNetMVC4Setup.exe と AspNetMVC4Setup_JPN.exe を入手してインストールしました。

インストールした結果、上の画像のように VS2010 でも MVC4 のテンプレートが利用できるようになりました。

この画面で[OK]ボタンをクリックすると下の画像のダイアログが現れ、MVC4 用に用意された (1) 空、(2) 基本、(3) インターネットアプリケーション、(4) イントラネットアプリケーション、(5) モバイルアプリケーション、(6) Web API という 6 種類のテンプレートから選べるようになっています。

MVC4 用テンプレート

VS2012 に実装されているテンプレートとは少し違いがあって、VS2010 には MVC4 の新機能の一つである Single Page Application 用のテンプレートがありません。ベータ版には実装されていたが、開発が間に合わず RC 版で削除されたそうです。

全ての機能はとてもまだ使いこなせてません。なので、Web や本の記事の受け売りですが、以下に主な新機能の概要を書いておきます。

  1. モバイルアプリケーション・テンプレート
    基本的な構造は、「インターネットアプリケーション」テンプレートで提供されるフォーム認証を使用するアカウントコントローラーを含むアプリケーションと同じだそうです。ただし、View のデザインに jQuery Mobile を使用することで、モバイル端末でのタッチ操作を行いやすい Web アプリケーションを開発できるようになっているそうです。
  2. Display Modes によるビューの切り替え
    デスクトップ PC ブラウザ向けの View と、モバイル端末ブラウザ向けの View をそれぞれ用意しておくことにより、ASP.NET MVC4 フレームワークが自動的にブラウザ種類を判断して View の切り替えを行う機能です。モバイル端末の種類ごとに View を用意し(例えば、iPhone 用とAndroid 用)切り替えることも可能とのことです。
  3. jQuery Mobile, View Switcher と Browser Overriding
    モバイル向け Web アプリケーション作成には、上に述べた「モバイルアプリケーション」テンプレートを利用するアプローチの他に、「インターネットアプリケーション」テンプレートをベースとした Web アプリケーションにモバイル端末向け View を追加するアプローチがあります。
    それには NuGet パッケージとして提供されている jQuery.Mobile.MVC を VS2010 の[ツール(T)]メニューからプロジェクトに追加します。それにより jQuery Mobile と Display Modes をベースとした View Switcher 機能が利用できるようになります。
    Browser Overriding は、ブラウザ上に表示されるリンクの操作で、デスクトップ用の表示とモバイル端末用の表示を切り替えるのに用いる MVC4 の新しい機能だそうです。
  4. ASP.NET Web API
    ブラウザやモバイルデバイスを含むさまざまなクライアントに対して RESTful なサービスを提供するのに適した HTTP サービス構築用のフレームワークです。
    このテンプレートを利用して、RESTful な CRUD (Create, Read, Update, Delete)処理に必要な HTTP サービスのため、POST, GET, PUT, DELETE それぞれの HTTP メソッドに対応したアクションメソッドの雛形を作成できます。 概要は MSDN Blog の記事 ASP.NET Web API を使ってみよう: MVC 4 新機能シリーズ が参考になると思います。
  5. ASP.NET Single Page Application
    JavaScript と Web API をベースとし、AJAX と HTML 5 を使用して、定期的にページを再読み込みしないで、ユーザーのアプリケーション操作に合わせてページを動的に更新し、滑らかで応答性の高い Web アプリケーションを作成するためのテンプレートだそうです。
    概要は MSDN マガジンの記事 単一ページ アプリケーション: ASP.NET を使用して最新の応答性の高い Web アプリケーションを構築する が参考になると思います。
    ベータ版の時点からサポートが外された JavaScript ライブラリもあるそうなので、VS2010 にこの機能を追加する場合はその点に注意する必要がありそうです。(VS2012 を使用したほうがよさそうです)

上記以外の MVC4 の新機能としては、Razor 構文(ASP.NET Web Pages 2)の新機能、JavaScript/CSS ファイルの縮小化と結合処置の自動化機能、Visual Studio コード生成のためのレシピ機能、非同期コントローラーの Task サポート、NuGet パッケージングマネージャーによるコンポーネント管理があります。

・・・が、とてもついていけないので説明は割愛します。もっと勉強しないと世の中の技術の進歩に付いていけないようです。(汗)

Tags:

MVC

ビューから Entity Data Model 生成

by WebSurfer 2011年4月24日 13:12

Visual Studio のデザイナを使って、テーブルではなくビューから Entity Data Model(以下、EDM と書きます)を作成する時の話です。

ビューから EDM を作成

ビューもしくは主キーを持たないテーブルから EDM を作成しようとすると、以下のようなエラーメッセージが出て、有効な EDM が生成されないことがあります。

「テーブル/ビュー 'xxxxx' に主キーが定義されておらず、有効な主キーを推論できませんでした。このテーブル/ビューは除外されました。エンティティを使用するには、スキーマを確認し、正しいキーを追加して、コメントを解除する必要があります。」

検索して調べてみると、そのあたりのことは The table/view does not have a primary key defined というページに詳しく書いてありました。要約すると、以下のとおりです。

EDM の各 Entity は Key を持つ必要があり、ビューや主キーのないテーブルの場合は、デザイナが NULL 不許可の列を主キーとして推定して EDM を生成します。

しかしながら、ビューが取得する全列が NULL 許可の場合、デザイナは主キーを推定できず、有効な EDM を生成できないので、上記のエラーメッセージが出るということだそうです。

その場合でも、関係する SSDL, CSDL, MSL は edmx ファイルの中に生成されていますが、SSDL 部分がコメントアウトされていたり、その他 CSDL, MSL も不完全な内容となってます。

以下の例は、すべての列が NULL 許可のビューから作成した EDM の中身です(xml ファイルなのでメモ帳で開くことができます)。

<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="2.0" 
  xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
  <!-- EF Runtime content -->
  <edmx:Runtime>
    <!-- SSDL content -->
    <edmx:StorageModels>
      <Schema ・・・中略・・・

  <!--生成中に見つかったエラー:
  警告 6013: テーブル/ビュー 'xxxxx' に主キーが定義されてお
  らず、有効な主キーを推論できませんでした。このテーブル/ビ
  ューは除外されました。エンティティを使用するには、スキー
  マを確認し、正しいキーを追加して、コメントを解除する必要が
  あります。
      
  <EntityType Name="ViewForEdmTest">
    <Property Name="ContactName" Type="nvarchar" MaxLength="30" />
    <Property Name="ContactTitle" Type="nvarchar" MaxLength="30" />
    <Property Name="Address" Type="nvarchar" MaxLength="60" />
    <Property Name="City" Type="nvarchar" MaxLength="15" />
    <Property Name="Region" Type="nvarchar" MaxLength="15" />
    <Property Name="PostalCode" Type="nvarchar" MaxLength="10" />
    <Property Name="Country" Type="nvarchar" MaxLength="15" />
  </EntityType>-->

      </Schema>
    </edmx:StorageModels>

    <!-- CSDL content -->
    <edmx:ConceptualModels>
      ・・・中略・・・
    </edmx:ConceptualModels>

    <!-- C-S mapping content -->
    <edmx:Mappings>
      ・・・中略・・・
    </edmx:Mappings>
  </edmx:Runtime>

  <!-- EF Designer content (DO NOT EDIT MANUALLY BELOW HERE) -->
  <Designer ・・・中略・・・
  </Designer>
</edmx:Edmx>

エラーメッセージの「正しいキーを追加して、コメントを解除・・・」というのは、それを書き直せということで、上に紹介したページの First Solution のことを言っています。

edmx ファイルをメモ帳で開いて、関係する SSDL, CSDL, MSL を書き直せば、確かに EDM 本体は有効になります。上の画像は、SSDL, CSDL, MSL を書き直したあと、edmx ファイルを Visual Studio で開いたもので、有効な EDM として表示されています(直す前は何も表示されません)。

ただし、Xxxxx.Designer.cs の定義が不完全なままなので、結局直した EDM はアプリケーションで利用できなかったのですが(自分が試した限りです)。

edmx ファイルを自力で書き直す以外の解決方法は以下の通りです。

  1. ビューが取得するフィールドに主キー列を含める。
  2. ISNULL 関数を利用する。

ビューにはもともと主キーなどはありませんが、ビューが取得するフィールドに主キー列が含まれていると、その列が NULL 不許可となり(デザイナがその列を主キーとして推定し)、EDM の生成に成功します。

2 番目の解決策は、上に紹介したページの Second Solution です。例えば、以下のように ID 列を追加してやります。なお、ROW_NUMBER() だけではダメで、ISNULL が必要ですので注意してください。

SELECT ISNULL((ROW_NUMBER() OVER (ORDER BY ContactName ASC)), 0) AS ID, ContactName, ContactTitle, Address, City, Region
FROM   dbo.Customers

なお、上記 1, 2 のいずれの場合も、EDM 生成時に以下のメッセージが出ますが、xxxxx.edmx ファイルは、xxxxx.Designer.cs を含めて、問題なく生成されているはずです。

「テーブル/ビュー 'xxxxx' には主キーが定義されていません。主キーは推論され、定義は読み取り専用のテーブル/ビューとして作成されました。」

Tags: , ,

ADO.NET

About this blog

2010年5月にこのブログを立ち上げました。その後 ブログ2 を追加し、ここは ASP.NET 関係のトピックス、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  2017年3月  >>
2627281234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar