2

我尝试将网络摄像头支持集成到 C# 解决方案中。首先,我从 Touchless.Vision 中学到了很好的例子。它包含具有 3 个组件的 C# 解决方案: - 一个 Windows 窗体项目(C#,任何 CPU) - 一个包装项目(C#,任何 CPU) - WebCamLib 项目(C++,x64)

我使用Win7 x64。所以这个例子工作正常。至少从我将 C 库/项目的平台目标从 Win32 更改为 x64 的那一刻起。

但后来我在另一个 C# 解决方案下添加了两个项目(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 平台。我认为不应该有任何基于平台的冲突。

这两种情况有什么不同?我应该检查什么?

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 非常适合 # 类库。调用程序集决定如何加载程序集。因此,如果您在 64 位机器上调用 AnyCPU 类库的 32 位应用程序,它将像 32 位库一样加载。

在 VS2010 中,与 VS2008 相比,行为发生了变化。当您创建控制台、WPF 或表单应用程序时,目标平台将始终是 x86(32 位)。我的建议是使用 x86,除非您绝对需要或想要创建 64 位版本的应用程序。64 位应用程序有一些好处,我相信在未来的某个地方,32 位应用程序的使用将完全消失,但是因为维护两个版本会使测试软件、创建版本、测试这些版本所需的时间增加一倍,等等,我通常不会费心创建 64 位版本。

Rick Byers 不久前写了一篇有趣的文章:AnyCPU Exes 通常比它们的价值更麻烦

于 2012-10-17T10:03:25.643 回答