是否可以从托管 C++/CLI 项目正常运行非托管 C++?

2024-01-11

我正在将一个纯非托管 VC++ 9 项目包装在 C++/CLI 中,以便从 .NET 应用程序中简单地使用它。我知道怎么写wrappers https://stackoverflow.com/questions/15505992/can-you-use-c-libraries-natively-in-a-c-cli-winforms-application?rq=1,以及非托管代码可以从.NET执行 https://stackoverflow.com/questions/15487831/how-to-use-a-c-project-from-within-a-net-application,但我不能完全理解的是:

  1. 非托管库是一个非常复杂的 C++ 库,使用了大量内联和其他功能,因此我无法将其编译为/clr- 标记的托管 DLL。我需要使用普通的 VC++ 编译器将其编译为单独的 DLL。

  2. 如何从该非托管代码中导出符号,以便可以在 C++/CLI 项目中使用它?我是否将我需要的每个课程标记为可见extern?是这么简单还是还有更复杂的事情?

  3. 如何访问 C++/CLI 项目导出的符号?我是否只包含非托管的头文件源代码C++ 链接器会从非托管 DLL 中获取实际代码吗?或者我是否必须在指向 DLL 中的类的新头文件中手动编写一组单独的“外部”类?

  4. 当我的 C++/CLI 项目创建非托管类时,非托管代码会在正常的 VC9 运行时中完美运行还是会被迫在 .NET 中运行?导致更多兼容性问题?

  5. C++ 项目创建了大量实例,并拥有自己的自定义实现的垃圾收集器,全部用纯 C++ 编写,它是一个 DirectX 声音渲染器并管理大量 DirectX 对象。所有这些都会正常工作吗?或者此类 Win32 功能会受到任何影响吗?


您可以从普通的本机 C++ 项目(例如,从十多年前的 Visual Studio 6.0 导入)开始,当您今天构建它时,它将链接到 VC 运行时的当前版本。

然后您可以添加一个新的foo.cpp文件,但配置该文件,使其启用 /CLR 标志。这将导致编译器从该文件生成 IL,并链接一些额外的支持,导致 .NET 框架在启动时加载到进程中,因此它可以进行 JIT 编译,然后执行 IL。

应用程序的其余部分仍然像以前一样本地编译,并且完全不受影响。

事实上,即使是“纯粹的”CLR 应用程序实际上也是一个混合体,因为 CLR 本身(显然)是本机代码。混合 C++/CLI 应用程序只是通过允许您添加更多与某些 CLR 托管代码共享进程的本机代码来扩展此功能。它们在进程的整个生命周期中共存。

如果你做了一个标题foo.h并附有声明:

void bar(int a, int b);

您可以在本机代码或foo.cppCLR 代码。编译器/链接器组合负责处理所有事情。应该不需要做anything特别适合从 CLR 代码中调用本机代码。

您可能会收到有关不兼容开关的编译错误:

  • /ZI - 用于编辑和继续的程序数据库,将其更改为仅节目数据库
  • /Gm- 你需要禁用最小重建
  • /EHsc- C++异常,改为是,但有 SEH 例外 (/EHa)
  • /RTC- 运行时检查,将其更改为Default
  • 预编译头文件 - 将其更改为不使用预编译头
  • /GR-- 运行时类型信息 - 将其更改为On (/GR)

所有这些更改只需要对特定的 /CLR 启用的文件进行。

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

是否可以从托管 C++/CLI 项目正常运行非托管 C++? 的相关文章

  • C/C++ 程序是在 CPU 上运行还是在内核上运行?

    我已经编程很多年了 但有一件事我一直不明白 有两种类型的编程语言 编译型语言和解释型语言 编译型语言首先需要编译成解释型语言 然后才能执行 例如 C C 需要先编译为机器语言 然后才能执行 我的问题来了 谁真正运行已编译的 C C Wind
  • 为什么不能使用initializer_list来初始化unique_ptr的向量? [复制]

    这个问题在这里已经有答案了 我想知道为什么initializer list 不能与unique ptr 一起使用 std vector
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • 不能使用函数名称距离

    以下代码可以正常编译 include
  • ASP.NET 数据集 getdataBy 无法启用约束。一行或多行包含违反非空、唯一或外键约束的值

    你好 我有一个非常简单的网络表单 我在此表单上有一个按钮和一个网格视图 以及一个包含链接表 bill docket docket bill 等的数据集 在按钮上单击我使用以下代码 protected void button click ob
  • MSVC10 /MP 在项目中跨文件夹构建非多核

    我希望有人指出我们所遇到的错误或解决方法 使用 MP 编译项目时 似乎仅同时编译同一文件夹中的文件 我使用进程资源管理器来滑动命令行并确认行为 项目过滤器似乎对同时编译的内容没有影响 项目结构disk Folder project vcxp
  • 我可以将特定警告视为错误吗?

    以下是我有时在学生代码中看到的模式的简化版本 bool foobar int a int b if a lt b return true 当然 真正的代码要复杂得多 Visual Studio 报告警告 C4715 并非所有控制路径都会返回
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • 如何实现可变虚拟成员函数

    所以我有这个功能 virtual void CallRemoteFunction const char pServerGameObjectId const char pFunctionName OVariant arg1 OVariant
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • DataContractJsonSerializer 包含元素类型子类型的通用列表

    我要使用DataContractJsonSerializer用于 JSON 序列化 反序列化 我在 JSON 数组中有两种对象类型 并希望将它们都反序列化为相应的对象类型 具有以下类定义 DataContract public class
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • Xamarin.Android JmDNS 绑定问题

    我开始研究 Xamarin Android 的 JmDNS 绑定 我设法构建了绑定 但无法从代码中引用它 https github com ytn3rd monodroid bindings tree master JmDNS https
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • C 中函数“fgets”的参数太少

    每当我编译这个错误时 我都会收到该错误 但我不知道为什么 我直接从书上抄袭这个 有人可以帮忙吗 include
  • 不兼容的指针到字符转换

    我正在编写一个程序 将卡片值写入 52 个点字符的多维数组中 该程序是一个测试数组 稍后我将其作为函数写入主程序中 在程序中 我通过以下方式初始化 for 循环计数0通过51 我用一个switch语句调制13将卡牌值分配给数组点 但是 我收
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • 使texture2D在运行时/脚本Unity3D中可读[重复]

    这个问题在这里已经有答案了 我有一个插件 可以让我访问 Android 手机图库中的图片 这给了我一个Texture2D类型的纹理 然后我想使用 GetPixels 函数对其进行编辑 但默认情况下它未设置为可读 如何使纹理可读 以便我可以在
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont

随机推荐

  • 使用 LOGON32_LOGON_NEW_CREDENTIALS 的 LogonUser 适用于远程不受信任的域计算机

    因此 两台机器之间不存在信任 它们位于不同的域中 我已使用登录类型使用 LogonUser API 成功连接到远程计算机 LOGON32 LOGON NEW CREDENTIALS 我能够使用 UNC 共享检索目录的内容 并创建文件流来 下
  • App Store Connect 不显示所有销售 - 为什么?

    为了能够更好地估计我们应用程序的收入 我们实现了一个数据库功能 该功能可靠地 我们在沙盒模式下测试了它 为订阅者在订阅后增加了一个订阅计数器 仅当应用内购买成功后 即当我们收到 StoreKit 的反馈以启用高级功能时 才会触发此功能 现在
  • 修复使用 uploadify 时 django csrf 错误

    我在 django 管理中使用 uploadify 但收到 403 错误 当我使用 csrf exempt错误消失了 但是这是非常危险的 有没有更好的方法通过使用 csrf exempt 装饰器来解决这个问题而不损害管理页面 提前致谢 听起
  • 是否可以使用“firebase-admin”包调用 firebase 函数?

    我有带有基于服务帐户的访问权限的节点应用程序 所以我使用firebase admin 正如我之前所看到的 firebase admin大部分重复firebase包 除了身份验证部分 签名和其他一些部分 但现在我想调用函数 但找不到任何等效项
  • Spring 服务层的 JUnit 测试用例

    我正在尝试配置 JUnit 并为 Spring 3 2 MVC 应用程序的服务层编写测试用例 我找不到太多关于如何从头开始配置 JUnit 并使其适用于 Spring 服务层的信息 这是我的问题 我真的不知道要使用什么版本的 junit 所
  • 如何在构建时在maven中设置项目版本?

    我正在尝试在我们的项目中实现语义版本控制 我测试了 Maven semver 插件 但这对我没有帮助 所以请不要问我为什么 我最终使用了 Maven Groovy 它的工作原理就像一个魅力 但是 当我安装或部署 Maven 项目时 存储库中
  • PHP/GD - 透明背景

    我想结合 GD 在 PHP 中执行以下操作 不幸的是 ImageMagick 不是一个选项 但这似乎是一个常见问题 因此has作为一个解决方案 我似乎找不到它 我想创建一个具有透明背景的PNG 然后我想在上面画一个矩形 在上面复制一个图像
  • 了解 的上限和下限 ?在 Java 泛型中

    我真的很难理解通配符参数 对此我有几个问题 作为类型参数只能在方法中使用 例如 printAll MyList
  • 如何递归读取所有记录并按级别深度SQL显示

    有没有办法在类似的表中递归读取记录并按深度级别排序 table id int parent int value string 1 1 some 2 1 some2 3 2 some3 4 2 some4 5 3 some5 6 4 some
  • C/C++:头文件中的静态函数,是什么意思?

    我知道在源文件中声明静态函数意味着什么 我正在阅读一些代码 发现头文件中的静态函数可以在其他文件中调用 函数是在头文件中定义的吗 这样实际的代码就直接在函数中给出 如下所示 static int addTwo int x return x
  • 如何向带状图添加多个标记?

    我想知道如何在同一个带状图中获得多个标记 tips sns load dataset tips coldict Sun red Thur blue Sat yellow Fri green markdict Sun x Thur o Sat
  • Android的Activity.runOnUiThread不是静态的,那么我该如何使用它呢?

    例如 如果我有一个线程正在执行昂贵的操作 并且我想从该线程在 Main 活动 类中触发 runOnUiThread 显然我不应该创建我的活动类 主要 的实例 所以如果我尝试 Main runOnUiThread mRunnable 从我的线
  • ActiveRecord 使用 JSON 而不是 YAML 进行序列化

    我有一个使用序列化列的模型 class Form lt ActiveRecord Base serialize options Hash end 有没有办法让序列化使用 JSON 而不是 YAML 在 Rails 3 1 中你可以 clas
  • 每次基于 Selenium 的自动化测试后我应该退出浏览器吗?

    我试图使我的 selenium 测试尽可能原子且相互独立 因此我决定退出浏览器并在每次测试运行后创建一个新的 Webdriver 实例 这种方法对我来说更有意义 并且通过讨论这个问题的多个线程得到了强化 e G 这是对相关问题的回答 htt
  • 没有entityClass,并且由于entityClassSet中有多个,所以无法自动推导

    我正在尝试实现具有多个实体类的解决方案 但它失败并显示以下错误消息 没有配置entityClass null 并且因为有多个 EntityClassSet 类 com myspace wla JobA 类 com myspace wla J
  • 如何将我的 csv 文件转换为这个 scikit learn 数据集

    抱歉 如果我在这里没有使用正确的术语 我有一个包含我自己数据的 csv 文件 我首先需要将其转换为另一个format http scikit learn org stable modules generated sklearn datase
  • 如何在 LinearLayoutManager - RecyclerView 中重叠项目(如堆叠卡片)

    是否可以重叠 RecyclerView 中的项目 我正在尝试使用 LinearLayoutManager 我的要求与 LinearLayoutManager 中的相同 我只需要从上到下重叠内部的项目 如堆叠卡片 我见过一些变体 https
  • 了解 Spring 上下文初始化顺序

    我有一组复杂的 bean 以及它们之间的依赖关系 所有豆子都是 Service Repository or Controller带注释 我使用 PostConstruct注解 虽然存在一些循环依赖 但系统仍然由 Spring 正确初始化 然
  • Laravel 多个工人运行两次工作

    我使用 Laravel 5 6 将作业分派到队列 然后使用主管激活该队列上的 8 个工作线程 我原以为 Laravel 会知道不要运行同一个工作两次 但我惊讶地发现它确实如此 同样的工作由不止一名工人负责 因此奇怪的事情开始发生 问题是 一
  • 是否可以从托管 C++/CLI 项目正常运行非托管 C++?

    我正在将一个纯非托管 VC 9 项目包装在 C CLI 中 以便从 NET 应用程序中简单地使用它 我知道怎么写wrappers https stackoverflow com questions 15505992 can you use