使用 C# 中的 C++ 类

Posted

技术标签:

【中文标题】使用 C# 中的 C++ 类【英文标题】:Use C++ class from C# 【发布时间】:2009-01-13 05:38:27 【问题描述】:

好的,所以我有这个 C++ 图像捕获类。我想知道是否可以得到一些帮助..我知道基本的 C++(我已经完成了一个 c 介绍和一个 c++ 类的介绍),但我不知道该怎么做:

我需要使用这个类(即在我的解决方案中创建一个新的c++项目)并使用c#来引用它并使用它来保存屏幕截图。

当我尝试添加一个新项目时,我不知道该选择哪一个(win32、mfc、atl、clr、abc、xyz 等)。

图像捕捉类在这里: http://pastebin.com/m72414ab

我不知道我是否需要创建 .h 文件或者只是一个 .cpp 文件就可以了。老实说,我不知道从哪里开始大声笑。我正在寻找解决方案,但我想在这个过程中学习,所以我下次不必问(更不用说我喜欢c++,所以我会继续用它编码)

【问题讨论】:

我不明白为什么我被否决了。 因为这是我最舒服的地方,也是我用来构建当前应用程序的地方。但我想使用这个 c++ 类来提高速度和内存。谢谢 【参考方案1】:

如果不了解有关 C++/CLI 的一些专业信息,您将无法轻松地从 C# 中使用 C++ 类 - 要么用 C 重写你的 C++ 类并使用 P/Invoke,要么找到一个完整的 C# 解决方案。

但我想使用这个 c++ 类来提高速度和内存。

我对此表示怀疑,除非您每秒捕获数千次图像,否则选择 C++ 没有任何好处,而且它会使您的程序更加复杂。坚持使用 C#,直到您知道您需要轻微的性能提升。

【讨论】:

【参考方案2】:

.NET 2.0 及更高版本在 Graphics 对象上包含 CopyFromScreen 方法。您可以创建图像,为其获取绘图表面(图形),然后从屏幕复制到图像中。

快速搜索一下 Google 生成了一个 simple tutorial,它使用 Visual Basic .NET 演示了这一点,尽管移植到 C# 很简单。

此解决方案导致您的 C++ 版本使用相同的 GDI+ 调用,其好处是不必链接外部 C++ 代码(如上所述,这并不简单)。

【讨论】:

【参考方案3】:

绝对可以使用 C# 中的 C++ 构造,但它确实需要一些肮脏的技巧。如果我没记错的话,上次我尝试这样做时,我在 C++ 和 C# 之间使用了托管 C++ 层,我认为这是最常见的方法。这种方法效果很好,但确实是不必要的复杂。

【讨论】:

以上是关于使用 C# 中的 C++ 类的主要内容,如果未能解决你的问题,请参考以下文章

为啥c#中的main方法总是放在类中而不是c++中

const 引用字段作为 C++ 类中的只读属性

C、C++、Java、C# 中的 main()

C#中变量的作用域

C#中的const形参

类中的 C++ 线程过程