トップ回答者
ファイルまたはアセンブリ 'XXXXXX'、またはその依存関係の 1 つが読み込めませんでした。エラーの解決策について

質問
-
visualstudio2012にて、sharepoint2013用ソリューションを作成しようとしています。
対象プラットフォームをx64としビルドすると、生成されるdll自体は64bit用に生成できているのですが、
(バイナリエディタで確認しています)
実行すると
ファイルまたはアセンブリ 'XXXXXX'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。
というエラーが発生します。
このプロジェクトで参照しているdllは「System.dll」「Sharepoint.dll」の二つですが、確認したところいずれも32bit用に生成されているようです。
「System.dll」は.netインストール時、「Sharepoint.dll」はSharePointServer2013インストール時に入るものだということまでは調べられたのですが、いずれも64bit用インストーラを使用していますし…
この現象の解決策をご存じの方はいらっしゃいますでしょうか。何卒よろしくお願いいたします。
- 編集済み sososo2014 2014年5月30日 2:34
回答
-
開発環境での話ですか? それともサーバー上での運用環境での話ですか?
OS は何でしょう。32-bit or 64-bit どちらですか? IIS のワーカープロセスは 32-bit/64-bit のどちらの設定になってますか?
基本的には、ASP.NET のファイルはすべて AnyCPU としてコンパイルされ、実行時に 32-bit/64-bit のどちらで動作するかは、IIS のワーカープロセスが 32-bit/64-bit のどちらの設定になっているかで決まります。
開発環境で ASP.NET 開発サーバーを利用しているといろいろ問題があります。開発環境の OS が 64-bit でも、Visual Studio は 32-bit 版しか提供されていませんので、64-bit OS 上では WOW 上で 32-bit 動作します。
その状態で、Visual Studio で Web アプリケーションを開発して ASP.NET 開発サーバで動作させた場合、Web アプリケーションは 32-bit で動作します。従って、x64 版の dll は動きません。Sharepoint の .dll には x64 版 しかないものがあるそうですが、そのような場合は ASP.NET 開発サーバーでは動きません。
詳しくは以下のページが参考になると思います。ASP.NET の話は Part 3 にありますが、基本的な知識を得るため Part 1 から目を通すことをお勧めします。既存の .dll のコンパイルオプション(AnyCPU, x86, x64)の見分け方は Part 2 を見てください。
Part 1. 64 ビット Windows OS の基本知識
http://blogs.msdn.com/b/nakama/archive/2008/10/30/part-1-64-windows-os.aspxPart 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspxPart 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注:Part 3 に「ビルド構成に "Mixed Platform" や ".NET" という、見慣れない構成が出現します」と書いてありますが、Visual Studio 2008/2010 professional にはそれらはありません。AnyCPU となっています。
- 回答としてマーク sososo2014 2014年5月30日 5:59
-
お世話になっております、ご提示いただいたページを参考に自己解決することが出来ました。
> 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.aspxVisualStudio2012をデバッグするときにはIIS Expressが起動しますが、これはOSが64bitであっても32bitとして挙動するのですね。
この記事の最新コメントにもありますが、VisualStudio2013であれば[ツール]から設定変更で64bitとしての挙動が可能なようです。
解決方法としてはレジストリキーの変更を行い、VisualStudio2012でのデバッグでもIIS Expressを64bitとして動作させるよう修正しました。上記エラーは解決し、dllが読み込まれるようになりました。
dllばかり疑うのが誤りだったのですね・・・。
大変参考になりました。SurferOnWww様、ありがとうございました。
- 回答としてマーク sososo2014 2014年5月30日 7:38
すべての返信
-
開発環境での話ですか? それともサーバー上での運用環境での話ですか?
OS は何でしょう。32-bit or 64-bit どちらですか? IIS のワーカープロセスは 32-bit/64-bit のどちらの設定になってますか?
基本的には、ASP.NET のファイルはすべて AnyCPU としてコンパイルされ、実行時に 32-bit/64-bit のどちらで動作するかは、IIS のワーカープロセスが 32-bit/64-bit のどちらの設定になっているかで決まります。
開発環境で ASP.NET 開発サーバーを利用しているといろいろ問題があります。開発環境の OS が 64-bit でも、Visual Studio は 32-bit 版しか提供されていませんので、64-bit OS 上では WOW 上で 32-bit 動作します。
その状態で、Visual Studio で Web アプリケーションを開発して ASP.NET 開発サーバで動作させた場合、Web アプリケーションは 32-bit で動作します。従って、x64 版の dll は動きません。Sharepoint の .dll には x64 版 しかないものがあるそうですが、そのような場合は ASP.NET 開発サーバーでは動きません。
詳しくは以下のページが参考になると思います。ASP.NET の話は Part 3 にありますが、基本的な知識を得るため Part 1 から目を通すことをお勧めします。既存の .dll のコンパイルオプション(AnyCPU, x86, x64)の見分け方は Part 2 を見てください。
Part 1. 64 ビット Windows OS の基本知識
http://blogs.msdn.com/b/nakama/archive/2008/10/30/part-1-64-windows-os.aspxPart 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspxPart 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注:Part 3 に「ビルド構成に "Mixed Platform" や ".NET" という、見慣れない構成が出現します」と書いてありますが、Visual Studio 2008/2010 professional にはそれらはありません。AnyCPU となっています。
- 回答としてマーク sososo2014 2014年5月30日 5:59
-
お世話になっております、ご提示いただいたページを参考に自己解決することが出来ました。
> 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.aspxVisualStudio2012をデバッグするときにはIIS Expressが起動しますが、これはOSが64bitであっても32bitとして挙動するのですね。
この記事の最新コメントにもありますが、VisualStudio2013であれば[ツール]から設定変更で64bitとしての挙動が可能なようです。
解決方法としてはレジストリキーの変更を行い、VisualStudio2012でのデバッグでもIIS Expressを64bitとして動作させるよう修正しました。上記エラーは解決し、dllが読み込まれるようになりました。
dllばかり疑うのが誤りだったのですね・・・。
大変参考になりました。SurferOnWww様、ありがとうございました。
- 回答としてマーク sososo2014 2014年5月30日 7:38
-
開発マシンで IIS が使えるのであれば、開発サーバーや IIS Express を開発に利用するのは避けたほうがいいと思います。
理由は、開発サーバーや IIS Express では問題なく動いていても、IIS を使った本番環境に移すと動かないということがあるからです。
ASP.NET 開発サーバーと IIS の違い、何が問題かは以下のページが参考になると思います。
ASP.NET 開発サーバーと IIS
http://surferonwww.info/BlogEngine/post/2011/11/18/ASPNET-development-server-and-IIS.aspxIIS Express は開発サーバーよりは少しマシですが、大差はないと思います。
特に、開発時に動いていたのが IIS では動かないという一番の原因となりうるアカウントの問題は、IIS Express でも起こり得るので注意が必要です。
また、IIS Express は「仮想パス」が設定できません(自分が知らないだけという可能性は否定し切れませんが)。なので、絶対パスやサイトルート相対パスを使っていたりするとリンクが切れて動かないということが起こり得ます。
-
うちのところでは IIS Express で http://localhost:XXX/aaa/bbb/ccc/ 以下で MVC4 の開発などをやっていますが、それはまた別の話でしょうか?
applicationhost.config の site 以下を直接書き換えて、
http://localhost:XXX/aaa/bbb/ccc/<Controller>/<Action>
のような URL でデバッグ実行しています。
リンク等は /aaa/bbb/ccc/<Controller>/<Action> のような感じで張っているのですが・・・。
あれ、私、何か話を取り違えていたりします?MCITP(Database Developer/Database Administrator)
-
先の自分のレスは言葉足らず&用語の使い方が不適切だったようです。詳しく書くと以下のようなことです。
Web サイトプロジェクトで、Visual Studio から [ファイル(F)] ⇒ [Web サイトを開く(E)] で表示されるダイアログから物理パス C:\WebSite\AppDirectory にある Web アプリを開いて、そのルート直下の Default.aspx を要求する場合、デフォルトでは以下のような URL になります。
開発サーバ: http://localhost:xxxxx/AppDirectory/Default.aspx
IIS Express: http://localhost:xxxxx/Default.aspx
ローカルIIS: http://<サイト名>/<アプリ名のエイリアス>/Default.aspx開発サーバとローカル IIS の場合は AppDirectory と <アプリ名のエイリアス> の名前を合わせれば /<アプリ名のエイリアス>/default.aspx というパスが使えますが、IIS Express の場合は困ったことになると言う話です。
ただし、先にも書きましたが、自分が設定する方法を知らないだけという可能性は否定し切れません。
Web アプリケーションプロジェクトの場合は IIS Express を使って /<アプリ名のエイリアス>/default.aspx というように設定する方法があるのは見つかりましたが、Web サイトプロジェクトの方は(どうせ IIS Express は使わないので)ギブアップしました。
- 編集済み SurferOnWww 2014年5月31日 3:26 一部訂正