如何使用C#中的C ++代码?

时间:2014-03-31 18:11:15

标签: .net c++-cli pinvoke

我需要使用this库(Interception)。它写在C++中。简而言之,它允许您操纵键盘或鼠标的输入。 我需要做的是使用C#中的一些来电。

我不确定要遵循哪条路径。到目前为止,我已经读过您可以使用PinvokeC++内使用C#代码。

关于PInvoke,我有很多问题:
1)Pinvoke库是否需要位于特定的系统路径中(例如system32)?

我已经知道,获得正确的PInvoke签名可能很难且容易出错,因为我无法在<{1}}中找到任何PInvoke签名EM> PInvoke.net ,
2)这是否意味着我应该停止使用Interception

我也看过,但没有详细说明,在Visual Studio中,当您创建项目时,可以创建PInvoke。 3)我应该使用它来构建链接Visual C++->CLR->Class Library的程序集吗?这个程序集可以在Interception中使用吗?

无论如何,如果C#替代C#,我会改用它。

2 个答案:

答案 0 :(得分:3)

1)不,如果库与可执行文件位于同一路径中,它将起作用。

2)您只使用带有C函数的PInvoke,而不是C ++对象。因此,使用PInvoke直接调用拦截库可能是不可能的。

3)您可以创建链接到拦截的C ++ / CLI库。但是您必须创建自己的.NET对象以将纯C ++对象包装在拦截中。

我建议您阅读一些关于在C ++中编写CLR的内容。在C ++ / CLI中创建CLR包装器可能是最简洁的方法。

答案 1 :(得分:2)

使用系统DLL search path解析p / invoke导入。所以DLL不需要在系统目录中。它只需要在DLL搜索路径中。实际上,您不应该将它放在系统目录中,因为系统拥有它。最好的位置是与可执行文件相同的目录。首先搜索该位置。

有问题的库有一个相当小的头文件,它呈现了一个C风格的界面。它是p / invoke的一个相当简单的候选者。您当然不会在pinvoke.net上找到任何翻译,但翻译此库也不难。

您当然可以使用C ++ / CLI进行互操作。这将添加另一个层和另一个模块。另一方面,你可以在链条的下方保持类型安全。如果您对interop和p / invoke没有信心和经验,那么C ++ / CLI可能会更高效。