2017-03-13 10 views
0

純粋に管理された.NET dll(アセンブリ)を持っていますが、現在はx86のプラットフォームターゲットでコンパイルされています。これは純粋な.NETコード(管理されていない参照や相互運用性はありません)なので、AnyCPUでもかまいませんが、何らかの理由でそうではありません。純粋に管理された.NET dllのプラットフォームターゲット(x86/x64/AnyCPU)は重要ですか?

このDLLは、AnyCPU .NET実行可能ファイルによって参照されています。もちろん、私はCSCの警告 "MSB3270:プロジェクトのプロセッサアーキテクチャの間には、が作成されています"が見つかりましたが、実行可能ファイルは64ビットWindowsでも動作するようです。しかし、私は、64ビット環境で動作しているときには何の問題も残っていないと確信することはできません。

質問:実行可能ファイルがx86/x64の実行を命令するものなので、純粋に管理されたdllのためのプラットフォームターゲット(x86/x64/AnyCPU)は重要ですか?

別の言い方をすると、実行中の64ビット.NET実行ファイルは、 "32ビット" .NET DLLのロード/実行に問題が発生しますか?

答えて

1

どのような種類の.exeがそのdllを参照するのかわからないため、.dllにとっては問題になる可能性があります。

x86ターゲットをお持ちの場合は、64ビットプラットフォーム上でAnyNet for exeが設定されていることがあります。そのexeは64ビットプロセスを開始し、あなたのx86 dllがそれを気に入らないか、または64ビットモードでうまくいった場合にアプリケーションを32ビットモードで実行させることになります。反対方向では、64ビットを強制することにした場合、アンマネージド32ビットライブラリをサポートするために32ビットを設定する必要があるexeがあるかもしれませんが、今でもあなたはまだ不運です。

exeの場合、アプリケーションをあるモードまたは他のモードに強制することがありますが、exeファイルがわからないdllの場合、ほとんどの場合AnyCPUは正しいオプションです。

もちろん、あなたがを実行する場合は、はexeを知っています、あなたはそれをexeがやっていることと一致させたいと思います。

1

アセンブリーは、ネイティブコードを参照するか、実行するプロセッサーについて前提とするコードブロックが含まれていない限り、AnyCPUでなければなりません。

32ビットのネイティブDLLSに依存しており、アーキテクチャを指定しないと、EXEの場合に問題が発生することがあります。

+1

"...ネイティブコードを参照していない限り..."それは私のdllがネイティブコードを使用するsqliteデータベースを使用していた1つのケースで私のためにうまくいった。 – k3b

+0

私はそれがAnyCPUであるべきであることを知っているが、そうではない。問題は、64ビットのexeがこの32ビットのdllを呼び出すと、これが実行時に問題を引き起こすかどうかです。私は質問を更新しました。 – SomeWritesReserved

0

完了したら、Joel Coehoornの答えでは、System.Math.ExpやSystem.Math.Pow(およびダブルタイプの他の多くの操作)のようないくつかの操作でも同じ動作をすることはありません結果。

これは、これらのプラットフォームのそれぞれで倍精度の精度が異なるため、命令セットとレジスタセットのサイズが一致しないため、丸め誤差が発生する可能性があります。しかし、効果はあまりありませんが、丸め誤差は15桁の後に表示されますが、マーケットトレーディングアプリケーションで作業する場合はエラーになります:)

+1

勝利の箱は手元にありませんが、どちらのprocアーキテクチャでも 'dll'をコンパイルすると違いが生じるはずです。違いはdllではなく 'exe'のproc archから来るはずです。もし誰かが確認してください。 – inquisitive

+0

ここでより完全な答えを得ることができます:http://stackoverflow.com/questions/4018895/why-does-math-exp-give-different-results-between-32-bit-and-64-bit一緒に –

0

純粋な管理対象dllでは、interopもアンマネージ/安全でないコードでも、プロセッサの継承問題にならない。理想的にはAnyCpuに設定する必要があります。

Machine PEヘッダーは、exeを起動する際にOSによってのみ使用されます。ドットネットプロセスがdllを読み込むと、そのフィールドは無視されます。 dotnet dllの場合、このフラグは、これが動作するまでのテストの距離に関するリマインダとしてのみ機能します。

ngenが使用されている場合、アセンブリと異なるビットネスのプロセスで使用されないことがあります。

関連する問題