質問
32ビットマシンで常にビルド/実行される.NETプロジェクトがあります。新しい64ビットコンピューターを入手し、そこで動作させるタスクに取り組んでいます。ビルドスクリプトはnantにあり、ある時点でnantタスクを使用してブーコードをコンパイルします。 booコードは、ビルドプロセスの早い段階でc#ソースからビルドされたコアDLLを参照します。
2つのことを試しました。32ビットモードで実行するようにビルドする方法と、64ビットモードで実行するようにビルドする方法です。いくつかのプログラム(boocを含む)でcorflagsを使用することで、32ビットモードでビルドされたプロジェクトをビルドできましたが、実行時に多数のダウンストリームの問題が発生しました。したがって、64ビットモードでビルドする必要がありますが、とにかく望ましいと思います。
nant / boocソースコードによると、booc nantタスクはCLRのProcessクラスを使用してインプロセスでbooc.exeを呼び出すため、親プロセスから32bitnessまたは64bitnessを継承する必要があります。しかし、それは私が見ているものを反映していません。
これは私がやったことです:
- 64ビットバージョンのPowerShellを使用してnantを呼び出した
- 指定されたプラットフォーム=" 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()が失敗します。
解決
問題は、32ビットモードを必要とするサードパーティDLLへの依存関係です。これは、corflagsが設定されていなくても可能です。