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

我有 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


qq_笑_17
浏览 59回答 2
2回答

森林海

仔细检查您的项目设置,尤其是链接器。检查链接器的命令行选项卡。最近我在其他选项中遇到了狂野的 X86 标志,这给了我类似的错误。在高级中,检查Target machine。尝试为链接器和编译器启用详细输出,并检查是否出现 x86。如果所有这些都被排除,请确保您的库确实已编译并且有效,例如。通过依赖步行器。

哔哔one

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