为了账号安全,请及时绑定邮箱和手机立即绑定

C++/CLI 包装器仅在 x86 机器上正常工作,我需要 x64 机器

C++/CLI 包装器仅在 x86 机器上正常工作,我需要 x64 机器

C#
qq_笑_17 2023-09-24 11:09:12
我有 x64 本机 C++ 库,必须将其传递给 C# 项目。我根据本教程构建了 C++/CLI 包装器,一切正常。但是,该项目仅在 x86 架构上编译。当我尝试将本机 C++ 库添加到项目时,我收到了运行时错误。项目不适用于 x64 架构,因为包装器由于某些原因需要 x86。另一方面,它不适用于 x86,因为该库需要 x64。一般来说,我对 C++/CLI、包装器和 C# 的经验很少,并且不太知道如何解决这个问题。当尝试编译解决方案时,我收到 runetime 错误System.BadImageFormatException: Could not load file or assembly 'Wrapper, Version=1.0.7178.20781, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was ma de to load a program with an incorrect format..错误文档链接这是我的包装using namespace System;namespace CLI {    template<class T>    public ref class Wrapper    {    protected:        T* m_Instance;    public:        Wrapper(T* instance)            :m_Instance(instance)        {        }        virtual ~Wrapper()        {            if (m_Instance != nullptr)            {                delete m_Instance;            }        }        !Wrapper()        {            if (m_Instance != nullptr)            {                delete m_Instance;            }        }        T* GetInstance()        {            return m_Instance;        }    };}...这是一个使用此包装器的 C++/CLI 类//**********************header file***********************#include "Wrapper.h"#include "../Core/Core.h"using namespace System;namespace CLI{    public ref class Model : public Wrapper<Core::Impl>    {    public:        Model();        bool test();    };//**********************Implementation******************************#include "Model.h"namespace CLI{    Model::Model()        :Wrapper(new Core::Impl())    {        Console::WriteLine("Creating new Impl-wrapper object!!");    }    bool Model::test()    {        return m_Instance->test();    }}它与我使用的教程几乎完全相同。我无法修改本机 C++ 库,因此它必须在 x64 架构上工作。您能否向我解释一下,为什么包装器不想在 x64 上编译,但在 x86 上完美运行,有没有办法解决这个问题。完美的答案将提供一个在 x64 架构上工作的 C++/CLI Wrapper 示例。提前致谢编辑,哦,我忘记添加我的项目的属性了。操作系统为Win10 (x64);.NET 目标框架 4.5.1;Core项目(最底层项目,这里不介绍)构建为静态.lib,Wrapper是动态.dll。VisualStudio 2017 v15.9.14
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

仔细检查您的项目设置,尤其是链接器。检查链接器的命令行选项卡。最近我在其他选项中遇到了狂野的 X86 标志,这给了我类似的错误。

在高级中,检查Target machine

尝试为链接器和编译器启用详细输出,并检查是否出现 x86。

如果所有这些都被排除,请确保您的库确实已编译并且有效,例如。通过依赖步行器。


查看完整回答
反对 回复 2023-09-24
?
哔哔one

TA贡献1854条经验 获得超8个赞

这可能是不正确的答案...但就我而言,我按照与您的 32 位应用程序(名为 Core)相同的指令创建了 C++/CLI 包装器,之后我将应用程序更改为 64 位,我也有相同的错误。我的经验是专门为 64 位 Core 应用程序创建一个新的 Wrapper 项目(我将所有 -h 和 -cpp 文件复制到新项目文件夹中,并添加到解决方案资源管理器中的项目中)。所以现在开始工作了。似乎在包装 32 位 dll 后,建立了一些到 32 位系统库的链接,但我在项目的属性中看不到它。只有创建新项目对我有帮助。



查看完整回答
反对 回复 2023-09-24
  • 2 回答
  • 0 关注
  • 54 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信