3

我有一个 C++ 项目,它由一些头文件、cpps、一些 lib 文件和 DLL 文件组成。

我想包装这些文件以便在 C# 项目中使用它们。

我想制作一个包含所有 C++ 项目的 DLL,然后用 C# 类包装它,这样我就可以使用它了。

所以我的问题是(使用 Visual Studio 2010):

  1. 如何制作最终的 DLL 文件。

    一个。我知道如何将 lib 文件链接到项目,但是如何链接 DLL?

    湾。我需要在我的头文件中添加什么,以便将其中声明的函数(在 lib 文件中实现)导入到 DLL 中。(什么是 __declspec)?

  2. 构建最终的 DLL 文件后,如何创建使用该 DLL 文件的 C# 项目?

提前致谢

4

2 回答 2

2

这称为 (COM) InterOp。幸运的是,原始 .NET Framework 的主要设计目标之一是促进托管代码和非托管代码之间的轻松互操作性。从广义上讲,在处理托管代码时可能希望实现三种不同类型的互操作性。

  • 从托管代码调用 COM 组件

  • 从托管代码调用本机 DLL。这称为平台调用或通俗地称为 PInvoke。(这就是你想要的)

  • 通过使用运行时可调用包装器 (RCW) 包装托管代码,允许 COM 组件调用托管代码。这可以用作有计划地逐步替换遗留代码的策略。

将数据从托管领域移动到非托管领域的过程称为编组。这是跨边界或其他边界序列化数据及其相关类型的名称。为了支持此过程,System.Runtime.InterOp 命名空间下存在一组类。

从广义上讲,该过程基本上如下:

  • 确定函数名称(我使用 Dependency Walker)
  • 确定函数签名(如果是 MSFT,请在 MSDN 上查找)
  • 确定代码所需的数据类型和结构
  • 编写托管代码以调用满足上面确定的标准的本机代码
  • 测试编写后的包装器代码,以确保它产生预期的结果(这通常是最乏味的部分)
于 2013-11-07T11:56:41.383 回答
1

您正在寻找 C++/CLI。使用这种混合,您可以编写一个可以包含任意数量的普通 C++ 代码的 dll,它可以包含可以使用 .NET 类型(如 System.String)作为其接口并在内部处理您的普通 C++ 类型的托管类。该 dll 可以像任何其他 .NET dll 一样在 C# 中使用。从调用程序的角度来看,它看起来就像是用 C# 编写的。

通常答案应该包含实际示例,但 C++/CLI 是一个很大的领域,你可以写一些书来描述你的场景。你可以在这里找到一个很好的教程和一个很好的概述。

于 2013-11-07T11:56:03.547 回答