2

64 ビット Windows 7、Studio 2012 を実行していますが、次の動作を完全には理解していません。

  1. regsvr32 経由でサードパーティの COM dll を登録します
  2. ASP.Net プロジェクトを作成します。
    • COM タイプ ライブラリを参照します
    • ターゲットCPUを「AnyCPU」に設定したままにします
    • すべてが正常にコンパイルされ、実行されます

  3. コンソール アプリを作成する
    • COM タイプ ライブラリを参照します
    • ターゲットCPUを「AnyCPU」に設定したままにします
    • コンパイルはできますが、「COM ライブラリが登録されていません」という実行時エラーが発生します。
    • ターゲット CPU を x86 に切り替えると、問題なく動作します。

サイトを IIS に展開するとき、アプリケーション プールで「32 ビット アプリケーションを有効にする」必要があります。おそらく、これは Visual Studio 開発サーバーで自動的に行われます。

Visual Studio 開発サーバーは、私のサイトを舞台裏で 32 ビットとして実行しているだけですか?それとも、ここで何かより深い作業が行われているのでしょうか?

4

2 に答える 2

4

はい、Web サーバーはサイトを 32 ビット アプリとして実行しています。

于 2013-03-28T15:19:16.467 に答える
3

Enabling "32-bit Applications" in IIS starts the x86 version of the w3wp process.

AnyCPU is a handy feature, provided by .NET, do decide on application startup which processor architecture to choose. This is possible, because .NET applications do not compile to x86/x64 machine code, but to Intermediate Language. When starting the application it compiles behind the scenes to either x64 or x86 machine code.

However, non .NET applications usually compile directly to machine code of the target system. Also COM servers must be registered in different registry branches for x86 and x64.

Since you have only a 32-bit compatible server (DLL) this leads to the situations you described:

  1. When launching your console application with AnyCPU it compiles to x86 or x64, based on the architecture your system uses. After this, the references get loaded. If you are on x64, the process cannot find your COM factory for the server. Otherwise everything is alright. This is why you should never use AnyCPU with COM references.
  2. IIS can only run in two modes: explicit x86, or x64 (default). Enabling "32-bit Applications" leads to an x86 process, that loads your web application in x86 mode. Your COM references are well, when you are on "AnyCPU". However, if you disable "32-bit Applications" for some reason, you will run into trouble. Setting "x64" as target plattform will result in an BadImageFormatException.
于 2013-03-28T15:32:47.150 に答える