by WebSurfer
2010年9月6日 13:30
ASP.NET ベースの Web アプリを作成する際、xsd ファイル(型付 DataSet + TableAtadter の定義ファイル)はどこに置いたらいいかという話です。
そんなことは知っていると言われそうですね。でも、App_Code フォルダの中に置くとダメなケースがあるということはご存知でしょうか?
(1) Web サイトプロジェクト
App_Code フォルダの中以外に選択肢はありません。上の画像の左側がそれです。
これは型付 DataSet + TableAtadter に限った話ではなく、ユーザー定義のクラスやメソッドをアプリケーションのどこからでも参照できるようにするには、App_Code フォルダに置くしか方法はありません。
(2) Web アプリケーションプロジェクト
少なくとも、VB を開発言語に使っている場合は、App_Code フォルダに置くのは NG です。
App_Code の中に xsd ファイルを作ると、自動生成された Xxx.Designer.vb のメソッド名が衝突を起こし、以下のようなエラーが出ます。
"コンパイル エラー メッセージ: BC30269: 'Public Sub New()' には同じ署名で複数の定義が存在します。"
ただし、上記は VB の時だけで、C# の場合は App_Code の下に xsd ファイルを作っても問題なしでした。
自動生成された Xxx.Designer.vb, Xxx.Designer.cs のコードを比べてみると、以下の違いがありました。
-
C# の場合は全体が名前空間(アプリケーション名.App_Code)で囲まれているが、VB の場合はそれがない。
-
C# には VB で名前の衝突を起こした New() というメソッドがない。
アプリケーションルート直下に xsd ファイルを作れば問題なしでした。見た限り自動生成されたコードはどちらも同じなんですが。
何故ルート直下に xsd ファイルを作ると OK で、App_Code フォルダ下では NG なのか理由は調べ切れていませんが、Web アプリケーションプロジェクトでそういう制約があるようです。
というわけで、Web アプリケーションプロジェクトでは、xsd ファイルはアプリケーションルート直下に置くのがよさそうです。上の画像の右側がそれです。
------------- 2011/12/3 追記 -------------
Web アプリケーションプロジェクトで、App_Code にクラスファイルを置くと、Visual Studio と ASP.NET による二重コンパイルの問題があるそうです。なので、特にその必要がない限り、Web アプリケーションプロジェクトで App_Code フォルダを設けるのは避けた方がよさそうです。詳しくは以下のページを参照してください。
App_Code folder doesn't work with Web Application Projects (WAPs)
「特にその必要がない限り」と書きましたが、ASP.NET MVC3 の Razor で @helper メソッドを切り出して利用する場合は、現在のところ App_Code フォルダを使用せざるを得ないようです。詳しくは以下のページを参照してください。
ASP.NET MVC 3 and the @helper syntax within Razor