3

.NET プロファイラー (CLR で使用される DLL) を作成しました。実際、DLL は Windows XP 上で、Any CPUおよびWin32アプリケーション用に設計されたアプリケーションで動作します。ただし、Windows 7 x64 では、x86アーキテクチャ用に設計されたアプリケーションでのみ機能します。どこに問題があるのでしょうか? どんな助けでも大歓迎です。

更新: の DLL を構築することは可能ですAny CPUか?? そうでない場合、代替手段はありますか?

4

2 に答える 2

2

私はDavidBromanブログで解決策を見つけました:

For x86 Machine 
 - Just run regsvr32 like you usually do.
For x64 or ia64 Machine    
 - If you want to be able to profile 64 bit apps, 
         run 64 bit regsvr32 against your 64 bit Profiler DLL
 - If you want to be able to profile 32 bit apps (WOW), 
         run 32 bit regsvr32 against your 32 bit Profiler DLL.
 - If you want to support both, do both!

つまり、x64マシン上のすべてのアプリケーションのプロファイルを作成する場合は、同じGUID(CLSID)を使用して2つのDLLを構築する必要があります。1つはx86アプリケーション用で、もう1つはx64アプリケーション用です。

于 2013-03-16T19:11:51.730 に答える
1

Windows 7 X64 マシンで "Any CPU" アプリを実行すると、明示的に 32 ビット (x86) モードで実行するように指示しない限り、デフォルトで 64 ビット (x64) CLR (共通言語ランタイム) になります。

.Net SDK で利用可能なコマンドライン ツールを使用してフラグを変更することにより、強制的に 32 ビット ランタイムにロードすることができます。

corflags.exe /32BIT+ myAssembly.exe

これにより、実際には x86 dll に戻ります。ほとんどの場合、xp マシンで動作する理由は、そのマシンで 64 ビット CLR がサポートされていないためです。そのため、「任意の CPU」であっても常に 32 ビット x86 モードで実行されます。

また、「任意の CPU」DLL は、それをロードするホスト アプリケーションのビット数に常にデフォルト設定されることに注意してください。

プロファイラー DLL で 64 ビット (x64) と互換性のない何かを実行しているに違いないと思います。問題は、「うまくいかない」とはどういう意味ですか。「不正な画像形式」のような例外が発生しますか?それとも、別の方法でコンパイルされた別のアセンブリによって DLL が呼び出されますか? 予想外の結果とは?

于 2013-03-07T23:20:51.717 に答える