none
VisualStudio2013(IDEから)にてWebサイトのビルドで64bit用のDLLを参照した場合 RRS feed

  • 質問

  • 64bit環境のVisualStudio2013にてWebサイトのビルドでエラーが発生して困っております。

    現象としては、IDEから『Webサイトのビルド』を実施すると、
    『オブジェクト参照がオブジェクトインスタンスに設定されていません』とメッセージが出力されます。

    おそらく原因はWebサイトから参照しているOracle.DataAccess.dllが64bitなのに対し、
    IDEからビルドする際に使用する『aspnet_compiler.exe』が32bit用を使用しているからではないかと思います。

    ちなみにmsbuildでビルドする際、64bit用のmsbuild.exeを使用すればエラーは発生せず、
    aspnet_compiler.exeの64bit用でコマンドラインからビルドしてもエラーは発生しません。

    IDEからソリューションをビルドした際にWebサイトのビルドも同時に実施し、
    上記エラーを消す方法はないでしょうか?

    どなたか解決策 もしくは 回避方法をご存じの方はいらっしゃらないでしょうか?
    2015年2月26日 3:11

すべての返信

  • Web アプリは何なのですか? ASP.NET Web Forms? or MVC?

    前者の場合 Web サイトプロジェクトですか Web アプリケーションプロジェクトですか?

    > 現象としては、IDEから『Webサイトのビルド』を実施すると、
    > 『オブジェクト参照がオブジェクトインスタンスに設定されていません』とメッセージが出力されます。

    ビルドとは具体的にどうやってますか?

    そのエラーはビルド時のものですか、実行時のものですか?

    エラーメッセージからすると実行時のように見えますが、32/64-bit の問題でそのエラーが出るのがちょっと解せないのですが・・・

    > おそらく原因はWebサイトから参照しているOracle.DataAccess.dllが64bitなのに対し、
    > IDEからビルドする際に使用する『aspnet_compiler.exe』が32bit用を使用しているからではないかと思います。

    ASP.NET は Any CPU でコンパイルされ、サーバーで 64/32-bit どちらで動くかはワーカプロセスの動作モードによって決定されます。

    詳しくは以下の記事の Part 3 を見てください。64/32-bit の基本がよく分かってない場合は Part 1 から読むことをお勧めします。

    Part 1. 64 ビット Windows OS の基本知識
    http://blogs.msdn.com/b/nakama/archive/2008/10/30/part-1-64-windows-os.aspx

    Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
    http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspx

    Part 3. ASP.NET 2.0 Web アプリケーションの 64 ビット対応
    http://blogs.msdn.com/b/nakama/archive/2008/11/13/part-3-asp-net-2-0-web-64.aspx

    これを一読してもらってから、問題を整理して、上記の私の質問関することを明らかにして、再度質問していただいた方がよさそうな気がします。

    2015年2月26日 3:54
  • 失礼いたしました。

    ビルドしようとしているのは『ASP.NET Webサイト』(C#)です。

    実際に実施しているオペレーションはソリューションエクスプローラーから対象のWebサイトを右クリックして『Webサイトのビルド』を実施しています。
    ソリューションを全ビルドした際もこのWebサイトのビルドが実施され、同様のエラーが発生します。
    Oracle.DataAcess.dllを参照からはずすとエラーはなくなります。
    なぜかWebサイトの配下にあるbinの中のOracle.DataAccess.dllを32bit版に置き換えても『Webサイトのビルド』ではエラーは発生しないですね・・・。

    ※本当はこの参照をはずしたいのですが、もともと.NET2.0で開発されていたプロジェクトの.Net4.5へのバージョンアップで、
     元の構成を保ったまま、外さない状態で進めたいと考えています。(その際にOracleもバージョンアップ)

    実行時はエラーにならず動作します。
    ※デバッグを実施した際も、Windows2012ServerのIIS上で動作させた際もエラーは発生しません。

    教えていただいたリンクを確認して、設定等におかしな点がないかどうか確認させていただきます。

    ありがとうございました。
    2015年2月26日 4:27
  • > ビルドしようとしているのは『ASP.NET Webサイト』(C#)です。

    上記『ASP.NET Webサイト』というのは「Web サイトプロジェクト」という理解でいいのですか?

    > ソリューションを全ビルドした際もこのWebサイトのビルドが実施され、同様のエラーが発生します。

    「Web サイトプロジェクト」であれば Visual Studio でビルドする必要はありません(別プロジェクトに分けたクラスファイルは別ですが)。

    ホントに「Web サイトプロジェクト」で間違いないですか? ビルドする必要があるのは「Web アプリケーションプロジェクト」なのですが。

    そもそも「Web サイトプロジェクト」と「Web アプリケーションプロジェクト」の違いを理解されているでしょうか? 不明でしたら以下の記事を読んで、そのあたりを明確にしてください。

    Web アプリケーション プロジェクトと Web サイト プロジェクト
    https://msdn.microsoft.com/ja-jp/library/dd547590(v=vs.100).aspx

    > Oracle.DataAcess.dllを参照からはずすとエラーはなくなります。
    > なぜかWebサイトの配下にあるbinの中のOracle.DataAccess.dllを32bit版に置き換えて
    > も『Webサイトのビルド』ではエラーは発生しないですね・・・。

    開発マシンに ODP をインストールしたときに、GAC に Oracle.DataAcess.dll が登録され、machine.config に必要な参照設定が追記されるのではないですか?

    それと、質問者さんが行った設定(Bin フォルダへの .dll のコピー、参照設定の追加)が不整合を起こしていて、おかしなことになっているということはないですか?

    2015年2月26日 5:46
  • 【追伸&参考】

    ASP.NET Web アプリで、GAC と Bin フォルダの両方にアセンブリが存在する場合、どちらにあるアセンブリがロードされるかについては、以下の記事が参考になると思います。

    ASP.net assembly loading from GAC or Bin
    http://blogs.msdn.com/b/pranav_rastogi/archive/2010/10/18/asp-net-assembly-loading-from-gac-or-bin.aspx

    2015年3月6日 1:39