2009-05-19 13 views
2

C#、.NET 2.0MSBuildは失敗しますが、Visual Studio内のビルドはうまく動作します

私は、2つのプロジェクト(ライブラリ参照として使用)を含むソリューションでASP.NET Webサイトを使用しています。 Visual Studioでビルド(デバッグまたはリリース)すると、すべて正常に動作します。ただし、MSBuildでのビルドは失敗します。

このビルドでした(実際にはnAntタスク経由で起動されています)。変更された唯一の事は、タイプが自分のコードの中で参照している新しいユーザーコントロールがあることです。

問題のコードは、私のASPXコードの背後にあります。 MessageAlertは、ユーザーコントロールです:

MessageAlert userControl = this.LoadControl("~/UserControls/MessageAlert.ascx") as MessageAlert; 
     userControl.UserMessage = message; 
     this.UserMessages.Controls.Add(userControl); 

タイプを認識するようにVisual Studioのを得るために 'MessageAlert' 私が持っていた:

1)上部に@Controlマークアップのclassname = "MessageAlert" に設定しますユーザーコントロールの(自動生成UserControls_MessageAlertを使用すると、どちらか働いていなかったため)

2)@Register

3を使用して、私のASPXのマークアップでユーザーコントロールを登録する)「ASPを使用しての追加"私のコードの背後にある

これらの手順を経て、ビジュアルスタジオからコードビハインドでMessageAlertタイプを正常に参照できました。しかし、MSBuildから「タイプまたは名前空間の名前 'MessageAlert'が見つかりませんでした(使用するディレクティブまたはアセンブリ参照がありませんか?)」

MSBuildの実行は非常に簡単です。ファイルを開き、設定プロパティをreleaseに設定します。

Visual StudioでMessageAlertへの型参照を取得するために必要なステップの数に基づいて、MSBuildプロセスに何かがないことが考えられます。しかし何?実際にはVisual StudioではMSBuildをバックグラウンドで呼び出しませんか?

ASPXのコードの背後にあるUserControl型を参照するより良い方法はありますか?

編集:明確にするために、MessageAlertユーザーコントロールは他の参照されているアセンブリ/プロジェクトでではなく、です。私はそれらを言いました、ウェブサイトと一緒に、MSビルドによって構築されている同じslnファイルであるソリューションファイルを構成するためです。

+0

"その他" 参照プロジェクトの一つでmessageAlert制御ですか?一般的にはこれを行うことはできませんが、回避策があります。 – DancesWithBamboo

+0

ウェブサイト「プロジェクト」でこれを使用していますか?もしそうなら、それは実際に*ビルドすることを意味するものではありません。これはまた、あなたが見ていた "UserControls_MessageAlert"に責任があるかもしれません。 –

答えて

0

これは、ソリューション内のHintPathの問題のようです。参照されているアセンブリをリンクされたプロジェクト項目(プロジェクト参照と同様に)としてプロジェクトに追加すると、MSBuildはリンクされたアセンブリをHintPathやAssemblyFoldersより優先して使用します。

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio_YourVersion_ \ AssemblyFoldersに任意の名前のキーを追加し、REG_SZ型の(デフォルト)値をアセンブリのパスに設定する方法もあります。

2

私も上記のようにこの問題を抱えていました。

私はこれがなぜだったのか、最終的なメスルとして、次のことを成功させることに決めました。

ユーザーコントロールのクラス名を変更します - 実際のクラス名は、aspxファイルのクラス名ではありません。

はそうあなたの例でも、ASPXに継承してこれを変更する(UserControls_MessageAlertから)MessageAlertにクラス名を変更

・ホープこれは誰かに役立ちます

+0

チップをありがとう。私はとにかにいくつかのリファクタリングを終わらせ、この問題を別の手段で解決しました。(これ以上内部的なコンテキストの外でUserControls_クラスを使用しようとしませんでした)、これで問題が解決されるかどうかは検証できません。しかし、ありがとう! – Matt

+0

私はこのアプローチが有効であることを確認できます。 –

0

あなたのページから「使用してASP」のセクションを削除してください@Controlディレクティブの "ClassName"プロパティが実際にクラスの名前と一致することを確認してください。実際のクラス名が "Controls_FilterElement"だったのに対し、ClassName値を "FilterElement"に設定しました。

ので、要約すると:

  • .ascx.vbとする.ascx上@Controlディレクティブの継承プロパティに自分のクラス名を確認してください。例えばInherits="FilterElement"
  • @Controlディレクティブに同じ値を持つClassNameプロパティを追加します。 ClassName="FilterElement"
  • 参照ページ/コントロールに「参照」要素を追加します。例えばコードビハインドで

    <%@ Reference Control="~/Controls/FilterElement.ascx" %>

  • 、直接クラスを指します。 ASPネームスペースを使用しないでください(これがmsbuildの難しさの原因です)。例えば(VBで)

    Dim ctrlElement As FilterElement = CType(LoadControl("~/controls/filterelement.ascx"), FilterElement)