2

Web カメラのサポートを C# ソリューションに統合しようとしています。まず、Touchless.Vision から素晴らしい例を学びました。3 つのコンポーネントを含む C# ソリューションが含まれています。 - 1 つの Windows フォーム プロジェクト (C#、任意の CPU) - 1 つのラッパー プロジェクト (C#、任意の CPU) - WebCamLib プロジェクト (C++、x64)

Win7 x64 を使用しています。したがって、例は正常に機能します。少なくとも、C ライブラリ/プロジェクトのプラットフォーム ターゲットを Win32 から x64 に変更した瞬間から。

しかし、別の C# ソリューションの下に 2 つのプロジェクト (C# ラッパーと C++ プロジェクト) を追加しました。C++ プロジェクトからメソッドを呼び出すと、常に失敗するようになりました。

System.BadImageFormatException was unhandled by user code
Message="Could not load file or assembly 'WebCamLib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format."
Source="Touchless.Vision"
FileName="WebCamLib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
FusionLog=""
StackTrace:
   at Touchless.Vision.Camera.CameraService.<BuildCameraList>d__0.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Touchless.Vision.Camera.CameraService.get_AvailableCameras() in C:\CustomWare.NET\CustomWare\WebCamWrapper\Camera\CameraService.cs:line 40

このソリューションでは、AnyCPU プラットフォームも使用されます。プラットフォームに基づく競合があってはならないと思います。

これら2つのケースの違いは何ですか?何を確認すればよいですか?

4

1 に答える 1

5

その理由は、64ビットアプリケーションから32ビットライブラリを呼び出しているためです。実行可能ファイルでAnyCPU構成を使用する場合、OSタイプとしてロードされます。32ビットマシンでは32ビット、64ビットマシンでは64ビット。

64ビットの実行可能ファイルから32ビットのライブラリを呼び出す場合、データ型などに違いがあり、深刻な問題が発生する可能性があります。たとえば、C#では、longのサイズは常に64ビット(System.Int64のエイリアス)であると指定されていますが、Cでは少なくとも32ビットのサイズとして定義されています。

またはあなたの場合、私は反対が当てはまると思います。

したがって、新しく追加したC#ライブラリが実際にAnyCPUまたはx64プロジェクトであり、Cプロジェクトがx64プロジェクトであるかどうかを確認してください。私の推測では、最後のものはそうではありません。

主題についてもう少し洞察を提供するには:

AnyCPUは#クラスライブラリには完全に問題ありません。アセンブリをロードする方法を決定するのは、呼び出し元のアセンブリです。したがって、AnyCPUクラスライブラリを呼び出す64ビットマシン上に32ビットアプリケーションがある場合、それは32ビットライブラリであるかのようにロードされます。

VS2010では、VS2008と比較して動作が変更されました。コンソール、WPF、またはフォームアプリケーションを作成する場合、ターゲットプラットフォームは常にx86(32ビット)になります。私の提案は、64ビットバージョンのアプリケーションを絶対に必要とする、または作成したい場合を除いて、x86を使用することです。64ビットアプリケーションにはいくつかの利点があり、将来的には32ビットアプリケーションの使用が完全になくなると確信していますが、2つのバージョンを維持すると、ソフトウェアのテスト、リリースの作成、それらのリリースのテストに必要な時間が2倍になるため、などなど、私は通常、64ビットバージョンを作成する必要はありません。

Rick Byersは、これについて少し前に興味深い記事を書いています。AnyCPUExesは通常、価値があるよりも厄介です

于 2012-10-17T10:03:25.643 に答える