从 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++ 函数 的相关文章

  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 使用.Net/C# 计算集合的频率分布

    是否有一种快速 简单的方法来使用 Linq 或其他方式计算 Net 集合的频率分布 例如 任意长的 List 包含许多重复项 遍历列表并计算 跟踪重复次数的巧妙方法是什么 查找列表中重复项的最简单方法是将其分组 如下所示 var dups
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 以编程方式拦截我的应用程序中包含的 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 但是当我尝试调用它的函数时 编译器说它不可用 另外 当我检查调