c# - C++/CLI 包装器只能在 x86 机器上正常工作,我需要 x64 机器

标签 c# c++ c++-cli 64-bit wrapper

我有 x64 native C++ 库,我必须将其传递给 C# 项目。 我基于 this tutorial, 构建了 C++/CLI 包装器一切都很好。 但是,该项目只能在 x86 架构上编译。 当我尝试将该 native C++ 库添加到项目时,我收到运行时错误。 项目不适用于 x64 体系结构,因为出于某些原因,包装器需要 x86。而且,另一方面,它不适用于 x86,因为该库需要 x64。

一般来说,我对 C++/CLI、包装器和 C# 的经验很少,而且我不太清楚如何解决这个问题。 尝试编译解决方案时,我收到运行时错误

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..

Link to error documentation

这是我的包装

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 架构上工作。 你能给我解释一下吗,为什么 wrapper 不想在 x64 上编译,但在 x86 上运行得很好,有没有办法解决这个问题。完美的答案将提供一个在 x64 架构上工作的 C++/CLI Wrapper 示例。 提前致谢

编辑, 哦,我忘了添加我的项目的属性。 操作系统是 Win10 (x64); .NET 目标框架 4.5.1;核心项目(最底层项目,这里不展示)构建为静态.lib,Wrapper为动态.dll。 VisualStudio 2017 v15.9.14

最佳答案

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

在高级中,检查目标机器

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

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

关于c# - C++/CLI 包装器只能在 x86 机器上正常工作,我需要 x64 机器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57673436/

相关文章:

c# - 以 ViewModel 作为属性的 Wpf 数据绑定(bind)

c# - TimeZoneInfo.ConvertTimeToUtc 问题

C++ 限制输入的字符数

.net - 在 C++/CLI 中 char* 和 System::String 之间转换的最佳方法是什么

c# - "Safe"互斥体的处理?

c# - Visual Studio 不会在不重新启动的情况下在项目和 NuGet 引用之间切换

c++ - 指向存储在堆栈中的变量的指针

c++ - 专用 Nvidia GPU 无法绘制 OpenGL

c++ - 当检查单元格是否被占用时 CLI/C++ 俄罗斯方 block block 崩溃 MSVisualStudio 2008

c++ - 调试混合代码应用程序中的启动问题