【发布时间】:2019-08-27 11:11:30
【问题描述】:
我有必须传递给 C# 项目的 x64 本机 C++ 库。 我基于this tutorial, 构建了 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 架构上工作。 您能否向我解释一下,为什么 wrapper 不想在 x64 上编译,但在 x86 上完美运行,有没有办法解决这个问题。完美的答案将提供一个适用于 x64 架构的 C++/CLI Wrapper 示例。 提前致谢
编辑, 哦,我忘了添加我的项目的属性。 操作系统为 Win10 (x64); .NET 目标框架 4.5.1;核心项目(最底层的项目,这里不做介绍)构建为静态.lib,Wrapper 是动态.dll。 VisualStudio 2017 v15.9.14
【问题讨论】:
-
您必须获得原生 C++ 库的 x64 版本才能取得成功。与图书馆所有者交谈。
-
@HansPassant 库是 x64。由于某些原因,包装器仅在 x86 上构建。但我设法解决了“包装器问题”,现在它建立在与库相同的 x64 上。即使,在编译解决方案时,我仍然收到相同的运行时错误。
标签: c# c++ c++-cli 64-bit wrapper