常に 32 ビット マシンでビルド/実行されている .NET プロジェクトがあります。私は新しい 64 ビットのコンピューターを手に入れ、そこで動作させる作業に取り組もうとしています。ビルド スクリプトは nant にあり、ある時点で nant タスクを使用して boo コードをコンパイルします。boo コードは、ビルド プロセスの早い段階で c# ソースからビルドされたコア DLL を参照します。
32 ビット モードで実行するようにビルドし、64 ビット モードで実行するようにビルドします。いくつかのプログラム (booc を含む) で corflags を使用することで、32 ビット モードでビルドされたプロジェクトをビルドできましたが、実行時にダウンストリームの問題が多数発生しました。だから私はそれを64ビットモードで構築する必要があります.とにかくそれが望ましいと思います.
nant/booc ソース コードによると、booc nant タスクは CLR の Process クラスを使用して booc.exe インプロセスを呼び出すため、親プロセスから 32 ビットまたは 64 ビットを継承する必要があると思われます。しかし、それは私が見ているものを反映していません。
これが私がやったことです:
- 64 ビット版の powershell を使用して nant を呼び出しました
- タスクで platform="x64" を指定しました。anycpuは問題ないはずなので、これを行う必要はないように感じますが、違いがあるようです。
これが私が得ているエラーです:
[booc] Compiling 5 files to 'C:\dev\build\MyProjectBoo.dll'.
[booc] BCE0106: Failed to access the types defined in assembly 'MyProject, Version=5.5.0.0, Culture=neutral, PublicKeyToken=null' - (C:\dev\build\MyProject.dll):Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
[booc] is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
[booc] is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
[booc] .
[booc] 1 error(s).
つまり、booc ソース コードによると、「参照されているアセンブリ内の型を反射的に一覧表示しようとしましたが、失敗しました」。それが「私は 32 ビットだと思いますが、これらは 64 ビットの dll です」という意味なのか、それとも何なのかわからず、非常に混乱しています。
これを機能させる方法についてのアイデアはありますか?
いくつかの作業の後に更新すると、問題がブーとは何の関係もないことがわかりました。dll をリフレクティブにロードする簡単な C# プログラムを作成しましたが、同じように壊れます。そのため、何らかの理由で、プラットフォーム (x86、x64、または anycpu) として設定したものに関係なく、x64 マシンにリフレクティブにロードできません。だから、本当にブーのせいではありません。ですから、これを掘り下げて、より良い質問があれば再投稿します。
新しいアップデート 私の主要な DLL のサード パーティの依存関係の 1 つが、corflags でビルドされていないにもかかわらず、32 ビット環境にあることを主張していることが判明しました。これにより、64 ビット モードで assembly.GetTypes() が失敗します。