正如问题中所说 创建简单的 c++.net 包装器。一步步

我正在使用.NET中使用C ++类,但在Visual Studio(2008)中遇到问题。

我有一个非托管类 A(使用 /clr 编译的 C++)。我创建了一个C ++/CLR类'Class1',该类别将A包装A,并使用匹配的方法委托与A方法。

如果我将A类的单元源文件包含在class1的类库项目中(托管),我没有问题,所有内容链接都很好,但是我有许多不受管理的C ++类,例如A DLL到托管库(班级包装纸)。[实际上,我认为目前没有必要将这些 DLL 连接到一起、 但编译器似乎需要它,给出了如下所示的相同错误]。

我创建了 VisualC /CLR/类库 并添加了我的 C 类(下面列出了 A),然后构建。[我使用了默认设置,但 在项目链接器设置中,我同时尝试了 用 "是 "和 "否 "登记输出] 没有出现任何错误,.DLL 文件也已创建。

我创建了 VisualC /CLR/类库 并创建了封装类 "Class1 我使用了所有默认设置。在项目属性下,我点击了 "引用""添加新引用"。 并选择第一步创建的 DLL。

我收到链接器错误:

test_NET_library.obj : error LNK2028: unresolved token (0A000009) "public: int __thiscall Z::A::m1(int,int)" (?m1@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m1(int,int)" (?m1@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
test_NET_library.obj : error LNK2028: unresolved token (0A00000A) "public: int __thiscall Z::A::m2(int,int)" (?m2@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m2(int,int)" (?m2@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
test_NET_library.obj : error LNK2019: unresolved external symbol "public: int __thiscall Z::A::m1(int,int)" (?m1@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m1(int,int)" (?m1@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
test_NET_library.obj : error LNK2019: unresolved external symbol "public: int __thiscall Z::A::m2(int,int)" (?m2@A@Z@@$$FQAEHHH@Z) referenced in function "public: int __clrcall test_NET_library::Class1::m2(int,int)" (?m2@Class1@test_NET_library@@$$FQ$AAMHHH@Z)
C:\temp\test_Cpp_CLI\test_NET_library\Debug\test_NET_library.dll : fatal error LNK1120: 4 unresolved externals

与我删除包装器类库项目中的 A.cpp 相同的错误(有效的选项)。我不明白为什么构建程序首先要尝试解决外部问题 因为这是一个图书馆,而不是一个程序。

我是否还需要在封装类库项目属性中添加其他内容? 或注册非托管类的 DLL,还是编译器选项?我还需要 .lib 文件来配合 DLL 吗?(项目目标目录中没有出现lib文件)

我还必须使用 __declspec(dllexport) 吗? 非集体成员] 如题: 从 Visual C++ DLL 导出非托管类?即使非托管 C++ 库是在启用 CLR 的情况下编译的。

(我也尝试过编译为静态库,但不知道如何添加 lib 文件到 CLR 类库项目)。

我的测试班是

namespace Z 
{
class A
{
public:

   int m1(int p1, int p2);
   int m2(int p3, int p4);
};
};

与实施:

#include "A.h"
namespace Z 
{
int A::m1(int p1, int p2) { return p1+p2; };
int A::m2(int p3, int p4) { return p3 * p4; };
};

包装类是

#pragma once
#include "../A.h"
using namespace System;
namespace test_NET_library {
 public ref class Class1
 {
 private: Z::A *a;
 public: Class1()
  : a(new Z::A)
   {}
 public: inline int m1(int p1, int p2)
  {  return a->m1(p1,p2);
  };
 public: inline int m2(int p3, int p4)
  {return a->m2(p3,p4);
  };
 };
}

根据问题: C++/CLI 混合模式 DLL 创建我也尝试过:

#pragma managed(push, off) 
#include "../A.h"
#pragma managed(pop)

而且这种推动也是围绕 A.cpp 进行的。

更新:根据 mcdave 的回复,我删除了 /clr 这产生了一个 DLL,现在如何使这个 DLL 可用于我的 test_NET_library?

我尝试了References/Add New Reference,并选择了新的这个新的DLL;并收到消息“无法添加对文件‘C:..\unmanagement_lib.dll’的引用,因为它既不是 .NET 程序集,也不是注册的 ActiveX 控件。”。DLL 已添加到项目的文件列表中,但编译器似乎忽略了它。

我尝试添加/现有项目并选择新的 DLL。但 .DLL 文件不是可选择的文件类型。

有帮助吗?

解决方案

根据您更新中的一些提示,我将尝试两种猜测......

  1. 当unmanagement_lib是静态链接库时,您是否将unmanagement_lib项目设置为test_NET_library的依赖项?(在“项目资源管理器”窗口中,右键单击 test_NET_library,选择“项目依赖项...”,然后选择 unmanaged_lib。)
  2. 当 unmanaged_lib 是 DLL 时,需要通过以下方式从 DLL 中导出类 回答并使 test_NET_library 依赖于 unmanaged_lib 项目。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top