gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:41:37 27 4
gpt4 key购买 nike

我尝试将网络摄像头支持集成到 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 平台。我认为不应该有任何基于平台的冲突。

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

最佳答案

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

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

或者在您的情况下,我假设相反的情况适用。

所以一定要检查你新添加的C#库是否确实是一个AnyCPU或者x64项目,你的C项目是一个x64项目。我的猜测是最后一个不是这种情况。

为了更深入地了解这个主题:

AnyCPU 非常适合 # 类库。调用程序集决定如何加载程序集。因此,如果您在 64 位机器上有一个调用 AnyCPU 类库的 32 位应用程序,它将像 32 位库一样加载。

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

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

关于C# 应用程序无法从 C++ DLL/项目调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12931332/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com