我想完成一项简单的任务: 我想生成一个调用一些.NET例程的C ++ / CLI库,并公开了一个我可以从纯C ++应用程序调用的静态方法。我想从我的原生应用程序静态链接到该lib。本机C ++应用程序调用的方法的签名应为
void (unsigned char* data, int length, _TCHAR* args[])
我对C ++ / CLI和C ++很新。那么,请你帮我解答一下这些问题:
对于我的小型C ++ / CLI项目,我假设类型需要是类库,其中lib作为输出,目标是vc9运行时(这样我可以确定它在最终用户PC上可用)。我在这个假设中是否正确?
您能否提供我需要在C ++ / CLI项目中编写的签名方法大纲的示例。特别是我应该如何正确转换为CLR类型(即byte [],int32和string)?我如何使用“extern”C“__ declspec(dllexport)”之类的东西来装饰该方法,以使此方法可以从我的原生C ++应用程序调用?
如何在C ++ / CLI中正确分隔cpp和h文件之间的代码?
最后,一旦我添加了lib引用,我将如何从我的原生应用程序中调用它?
谢谢。
答案 0 :(得分:1)
类库:正确,但您还需要将项目的配置类型从动态库更改为静态库。我不确定你的'目标vc9运行时'是什么意思 - 你需要使用与使用静态库的本机代码相同的运行时。
由于这是一个静态库,因此不需要__declspec(dllexport)
。如果您想知道如何转换为.NET类型,则需要发布代码实际执行的操作。通常,您需要Marshal::Copy
将C数组复制到.NET数组中,并marshal_as<>
将C字符串复制到.NET字符串中,但是仍然存在关于数据是否存在的问题意图是可变的,需要在返回之前编组回本机类型...
与C ++完全相同 - 标题中的声明,源文件中的定义。
与任何其他函数完全相同 - #include
包含声明的标题并调用函数。