从C#调用C ++代码而不创建DLL?

时间:2014-01-10 09:30:53

标签: c# c++ dll

我是C#中的菜鸟,我已经在网上搜索过了。无论如何,我仍然不确定这一点,我没有完全控制我必须实现的代码,这就是为什么我想确定我不需要做任何dll。我有一个带有方法的C ++文件,我想从C#代码调用这个方法。我刚刚在函数中添加了“extern C”。

当我将.h和.cpp文件添加到C#项目时,它们未被检测到。当然,当我尝试添加它作为参考时,它不起作用。

所以我绝对不得不制作一个dll?

3 个答案:

答案 0 :(得分:3)

您从C#访问C ++代码的选项:

  • 将C ++编译为非托管DLL并使用p / invoke进行访问。这需要使用C风格的API公开C ++代码。
  • 将C ++编译为非托管DLL并使用COM进行访问。这要求您将C ++包装为COM对象。
  • 将C ++编译为混合/模式C ++ / CLI程序集,并将程序集作为托管引用进行访问。这要求您将原始C ++包装为托管C ++引用类。

所有这些选项必然涉及创建另一个模块/程序集。您无法将C ++代码直接链接到C#程序集。

答案 1 :(得分:0)

您可能希望尝试使用PInvoke Interop Assistant生成通过Platform Invoke与DLL交互所必需的C#。请注意,这是不完美的,但YMMV。

如果您有足够的知识和耐心,另一种方法是使用类型库导入器创建托管包装器,从本机C ++ DLL中创建COM组件并从C#中使用它。

答案 2 :(得分:0)

您将无法与.cpp / .h文件进行交互,因为您至少需要一个二进制对象(程序集)供C#进行交互,而C#不会从.cpp / .h生成任何二进制文件。这是关于添加这些文件作为项目参考的主题。

至于你无法控制代码的论点 - 好吧,不要用实际的.cpp / .h制作一个DLL,而是制作你自己的瘦DLL,它有一个只包含的包装器对象标题,调用您将调用的任何方法,并链接到相应的.o文件或.lib或任何您拥有的。如果界面发生了变化,你就会改变你的东西包装器,这应该很容易。