带有1个函数的C ++ / CLI lib与本机C ++静态链接

时间:2012-04-26 19:50:13

标签: c++ .net interop c++-cli

我想完成一项简单的任务: 我想生成一个调用一些.NET例程的C ++ / CLI库,并公开了一个我可以从纯C ++应用程序调用的静态方法。我想从我的原生应用程序静态链接到该lib。本机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引用,我将如何从我的原生应用程序中调用它?

  5. 谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

  3. 与C ++完全相同 - 标题中的声明,源文件中的定义。

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