使用托管类包装C ++ DLL

时间:2010-10-18 20:31:21

标签: c++ linker unmanaged wrapper managed

我正在尝试用托管C ++包装一个非托管C ++ DLL,并且我不断收到链接错误。

即使我在项目中包含了我的library.lib并包含了正确的头文件。

这是托管类:

#pragma once
#include "..\Terminal\Terminal.h"
public ref class ManagedTerminal
{
    private:
Terminal * m_unTerminal;
public:

ManagedTerminal(void)
{
    m_unTerminal = new Terminal();
}
};

这是非托管类:

#include "..\Core1.h"
#include "..\Core2.h"

 __declspec(dllexport) class Terminal
{
private:
CoreObj m_core;

public:
Terminal();
void Init(char* path, char* filename);    
void Start();
void Stop();
void Run();
Array<Report> GetSnapshot();
~Terminal(void);
};

我得到的错误是:

错误5错误LNK2028:未解析的令牌(0A0000B3)“public:__thiscall Terminal :: Terminal(void)”(?? 0Terminal @@ $$ FQAE @XZ)在函数“public:__ clrcall ManagedTerminal :: ManagedTerminal”中引用(void )“(?? 0ManagedTerminal @@ $$ FQ $ AAM @ XZ)ManagedTerminal.obj TerminalWrapper

错误6错误LNK2019:未解析的外部符号“public:__thiscall Terminal :: Terminal(void)”(?? 0Terminal @@ $$ FQAE @ XZ)在函数“public:__ clrcall ManagedTerminal :: ManagedTerminal(void)”中引用(?? 0ManagedTerminal @@ $$ FQ $ AAM @XZ)ManagedTerminal.obj TerminalWrapper

谁能告诉我什么是错的? 谢谢:))

1 个答案:

答案 0 :(得分:1)

您必须匹配所有构建设置 - 特别是调用约定(CDECL与STDCALL) - 才能获得成功的链接。

从.NET 2.0开始,您还必须动态链接到c-runtime,因此请确保.dll和托管C ++项目都执行此操作。

基本上,进入两个项目的属性对话框,确保影响调用的内容相同。