0

我想完成一个简单的任务:我想生成一个调用一些 .NET 例程的 C++/CLI 库,并公开一个我可以从纯本机 C++ 应用程序调用的静态方法。我想从我的本机应用程序静态链接到该库。本机 C++ 应用程序将调用的方法的签名应该是

void (unsigned char* data, int length, _TCHAR* args[])

一般来说,我对 C++/CLI 和 C++ 还是很陌生。所以,你能帮我回答这些问题吗:

  1. 对于我的小型 C++/CLI 项目,我假设类型需要是以 lib 作为输出的类库,以 vc9 运行时为目标(以便我可以确定它在最终用户 PC 上可用)。我在这个假设中正确吗?

  2. 您能否提供一个带有该签名的方法大纲示例,我需要在我的 C++/CLI 项目中编写该签名。特别是我应该如何正确转换为 CLR 类型(即 byte[]、int32 和 string)?以及如何使用“extern "C" __declspec(dllexport)" 之类的东西来装饰该方法,以使该方法可从我的本机 C++ 应用程序调用?

  3. 如何正确分离 C++/CLI 中 cpp 和 h 文件之间的代码?

  4. 最后,一旦我添加了 lib 引用,我将如何从我的本机应用程序中调用它?

谢谢你。

4

1 回答 1

1
  1. 类库:正确,但您还需要将项目的配置类型从动态库更改为静态库。我不确定“以 vc9 运行时为目标”是什么意思——您需要以与将使用静态库的本机代码相同的运行时为目标。

  2. 由于这是一个静态库,__declspec(dllexport)因此不需要。如果您想知道如何转换为 .NET 类型,则需要发布您的代码实际执行的操作。通常,您希望Marshal::Copy将 C 数组复制到 .NET 数组中,marshal_as<>并将 C 字符串复制到 .NET 字符串中,但仍然存在该数据是否旨在可变且需要编组的问题在返回之前返回本机类型...

  3. 与 C++ 中的完全相同——在头文件中声明,在源文件中定义。

  4. 与任何其他函数完全相同——#include包含声明和调用函数的标头。

于 2012-04-26T19:55:08.933 回答