从 C#/.NET 调用 C++ 函数

2024-02-12

我有一个包含 C++ 项目和 C# 项目的解决方案。

C++ 项目定义了一个类,我想在 C# 中实例化该类并调用其成员函数。到目前为止,我成功实例化了该类:

CFoo Bar = new CFoo();

但是当我尝试调用它的函数时,编译器说它不可用。

另外,当我检查调试器中的对象时,没有显示任何成员。

我在这里缺少什么?


您需要在 C++/CLI 中将该类声明为ref class.

(请注意,我们谈论的是 C++/CLI,而不是 C++。我假设您必须在 C++ 项目中启用 CLR,否则您将无法获得新的CFoo上班。)

Edit:

您不需要将所有旧课程转换为ref类。

假设你有一些旧的 C++:

class FooUnmanaged
{
    int x;

    FooUnmanaged() : x(5) {}
};

然后尝试将其包装在 CLR 类中:

ref class FooManaged
{
    FooUnmanaged m;
};

正如您所注意到的,您会收到一条错误消息,指出这是不允许的。但试试这个:

ref class FooManaged
{
    FooUnmanaged *m;
};

那完全没问题。编译器不想分配嵌入在托管堆上的对象内的非托管对象的实例,但它很高兴有一个指针,它变成了System.IntPtr在生成的 IL 中。

这意味着您必须决定如何致电delete。最可能的解决方案是:

ref class FooManaged
{
    FooUnmanaged *u;

public:
    FooManaged(FooUnmanaged *u_)
        : u(u_) { }

    ~FooManaged() { delete u; }
};

就像在任何其他 C++ 类中一样。 C++/CLI 可能会在未来的版本中自动为我们完成此转换。

请注意,得到的 IL 是FooManaged类现在实现IDisposable,并且析构函数已变成Dispose方法。这允许 .NET 客户端正确地释放它,例如在 C# 中

using (var m = new FooManaged())
{

    // end of block: m will be disposed (and so FooUnmanaged will be deleted)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 C#/.NET 调用 C++ 函数 的相关文章

随机推荐

  • 以编程方式拦截我的应用程序中包含的 Android 3rd 方库发起的流量

    我正在尝试编写一些代码来拦截来自 到我的 Android 应用程序的任何网络流量 包括来自非 root 设备上的第 3 方库的流量 有办法做到吗 None
  • 淡出任何接近 UIScollView 边缘的内容

    正如标题所示 当一些 UIImageView 越来越接近 UIScrollView 的四个边缘中的任何一个时 我试图为它们提供淡出效果 由于用户可以拖动 UIImages 如果他将它们拖向边缘 它们就会开始淡出 而不是像 UIScrollV
  • Git 分支未显示所有分支

    我是 Git 的新手 我从 GitHub 克隆了一个分支 当我输入时会显示所有分支git branch 完成工作后 我成功地将其推送到新分支 之后 我将该文件夹复制到另一个目录 因为我想要备份以避免冲突 进入它 然后输入git branch
  • 如何有条件地从两个表之一中选择字段?

    我有两个表发票和待付款 它们都有以下共同行 发票 ID 和余额 我想在 MySQL 中进行选择 这样可以工作 伪代码 if invoice id exists in pending payments table select balance
  • 将扫描的 PDF 转换为可搜索的 PDF(在 R 中)

    我正在尝试使用以下命令将一系列扫描的 PDF 转换为可搜索的 PDFtesseract and pdftools包 我已经完成了两个步骤 现在我需要写回一个可搜索的pdf 阅读扫描版 PDF Run OCR 写回可搜索的 PDF eg lt
  • 如何在纯 Javascript 中的单选按钮上使用 addEventListener?

    如何在 html 中的单选按钮上附加事件侦听器 考虑这种形式
  • 如何使用 NDK 编译适用于 Android 的现有 C 程序?

    我正在编写一个 Android 应用程序来测试网络性能 并且我想在该应用程序中使用 iPerf 我可以找到已经为 Android 编译的二进制 iPerf 文件 然后我可以在手机上运行 iPerf 并收集其输出 但我对自己编译这些文件感兴趣
  • 如何在 Qt 中简单地序列化复杂结构并通过网络发送它们

    我正在创建一个客户端服务器应用程序 现在我正在处理一种最简单的方法来序列化一些类 将其传递到另一端 然后放回到我以后可以使用的类中 我意识到这并不简单 有些人可能会说在 C 或 C 等低级语言中不可能 但实际上通过大量编码是可以实现的 我想
  • 如何使用 Apache Cordova 3.4.0 在本地存储文件

    我在使用 apache cordova 的 文件 插件在 iOS 或 Android 设备上本地存储文件时遇到问题 我认为问题在于正确设置路径 这是我从 Xcode 收到的错误消息无法创建保存下载文件的路径 操作无法完成 可可错误 512
  • Conemu 和 console2 模拟器没有获取新的路径变量

    我想也许这是一个系统问题 但最近做了一个全新的安装 win7 64位 和一个干净的conemu安装 在旧的win32系统上conemu和console2都有同样的问题 此外 我发现研究的所有内容都与通过命令行添加变量有关 我通过 开始 gt
  • Bootstrap 3.0 媒体查询

    我正在开发一个基于 Bootstrap 3 html5 样板自定义构建 的小项目 并尝试使用 官方 媒体查询在引导文档中 http getbootstrap com css grid media queries Extra small de
  • 将 sklearn TfidfVectorizer 与已标记化的输入一起使用?

    我有一个标记化句子列表 想要安装 tfidf 矢量器 我尝试了以下方法 tokenized list of sentences this is one this is another def identity tokenizer text
  • 为什么这个 javascript 和 html 代码没有计算结果?

    这是代码
  • 如何使用c#从后台代码中查找SQL Server实例名称和服务器名称? [复制]

    这个问题在这里已经有答案了 可能的重复 SqlDataSourceEnumerator Instance GetDataSources 找不到本地 SQL Server 2008 实例 https stackoverflow com que
  • 基于 HTTPS 的 SOAP 客户端,双方均带有 SSL 证书

    我必须开发一个 SOAP 客户端 供应商向我发送了以下规格 将通过IP使用HTTPS进行传输 并打包为XML文档 以适应不同的XML方案定义 通讯是同步的 第三方需要等待响应 每个请求和响应都将被签名 我正在使用 PHP 中的soapCli
  • 如何启动 IPython 运行脚本?

    我的用例是我想初始化文件中的一些函数 然后使用定义的这些函数启动 IPython 有没有办法做这样的事情 ipython run script myscript py 在最新版本的 IPython 中 您确实需要添加 i之后可以选择进入交互
  • 通过 ssh 远程获取脚本

    我想通过ssh运行一个远程程序 这需要一定的环境 因此 在执行程序之前 我获取了构建环境的特定文件 如果我直接登录到机器上 这没有问题 但是当我通过 ssh 执行命令时 bin bash foo ssh user host source s
  • scala 中的惰性函数定义

    我一直在学习 Scala 我不得不说这是一门非常酷的语言 我特别喜欢它的模式匹配功能和函数文字 但我有 javascript ruby 背景 这些语言中我最喜欢的模式之一是惰性函数和方法定义模式 JavaScript 中的一个例子是 var
  • 在playframework中拦截请求并检查授权

    我在用着play framework 2 4 2使用Java 我想通过拦截所有请求并检查是否设置了会话值来验证用户是否已登录 所以我延长了默认HttpRequestHandler https www playframework com do
  • 从 C#/.NET 调用 C++ 函数

    我有一个包含 C 项目和 C 项目的解决方案 C 项目定义了一个类 我想在 C 中实例化该类并调用其成员函数 到目前为止 我成功实例化了该类 CFoo Bar new CFoo 但是当我尝试调用它的函数时 编译器说它不可用 另外 当我检查调