C#应用程序无法从C ++ DLL / Project调用方法

时间:2012-10-17 09:35:31

标签: c# c++

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

我使用的是Win7 x64。 所以这个例子很好用。至少从我将平台目标从Win32更改为x64 for C library / project。

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

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

1 个答案:

答案 0 :(得分:5)

原因是您从64位应用程序调用32位库。在可执行文件上使用AnyCPU配置时,它将作为操作系统类型加载。 32位机器上的32位,64位机器上的64位。

从64位可执行文件调用32位库时,数据类型可能会导致严重问题。例如,C#指定长总是64位大小(它是System.Int64的别名),而在C中它被定义为至少32位大小

或者在你的情况下,我认为恰恰相反。

因此,请确保检查新添加的C#库是否确实是AnyCPU或x64项目,并且您的C项目是x64项目。我的猜测是最后一个不是这样的。

提供更多关于这个主题的见解:

AnyCPU非常适合#class库。它是调用程序集,用于确定如何加载程序集。因此,如果在64位计算机上有一个32位应用程序调用AnyCPU类库,它将像32位库一样加载。

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

Rick Byers不久前写了一篇有趣的文章:AnyCPU Exes are usually more trouble than they're worth