托管代码与非托管代码(编程语言调用和非托管代码与托管代码混合编程的问题c++.net c#.net)

2024-10-13 15:35:16 2

托管代码与非托管代码(编程语言调用和非托管代码与托管代码混合编程的问题c++.net  c#.net)

大家好,今天小编来为大家解答以下的问题,关于托管代码与非托管代码,编程语言调用和非托管代码与托管代码混合编程的问题c++.net c#.net这个很多人还不知道,现在让我们一起来看看吧!

本文目录

编程语言调用和非托管代码与托管代码混合编程的问题c++.net c#.net

1. c#调用其他语言不一定要经过托管。比方说调用vb的类库,可以走托管的com封装也可以直接调用api访问com。c#有unsafe模式,可以编写非托管代码。vb的内置函数实际上是封装在msvbvmxx.dll等一些基础组件中的,它们有com接口也有导出函数,在c#中均可以访问到。(vb.net程序和类库本身就是.net组件,当然也能访问到。)2.非托管的c++可以调用.net类库希望提高性能可以用c#的unsafe块编写非托管代码,性能会有明显提升。也可以用汇编c++编写具有导出函数或com接口的模块供c#调用。甚至可以将需要运行的机器码用c#写入内存再调用(需要借助api)。。。总之,你的想法可以实现。

使用 P/Invoke 从 Unity 高效地与非托管代码对话

在上一篇关于 P/INVOKE 的文章中,我们学习了如何从 Unity 内部调用非托管方法,以及如何跨互操作屏障传递参数和返回值。

现在让我们开始DllImport在我们的代码库中到处撒播以获得乐趣和利润!对?好…

那么让我们来看看我们是如何在 Baracoda 的项目中应对这些挑战的!

假设您有一个针对静态库编译的 iOS 代码的现有版本,libios_plugin.a. 因此,让我们添加插件的 Android 版本libandroid_plugin.aar,其中包含内部libandroid_plugin.so.

然后在尝试执行本机代码时观察它失败:

我们的第一个问题是,在 iOS 上,我们使用的是静态链接库,它要求传递给的名称DllImport是__Internal.

但是,我们有一个名为 的 Android 版本的动态链接库libandroid_plugin.so,并且该名称需要在DllImport.

我们可以使用///指令和Unity的平台脚本符号来使用条件编译#if,如#elif或选择#else将基于当前平台编译的属性的版本。#endifUNITY_ANDROIDUNITY_IOS

万岁,它有效!但是,呃……如果我们需要更多方法,那就太冗长了,而且我们现在只支持 2 个平台。那么我们能做些什么来避免重复这个巨大的块呢?

好吧,库名称必须是一个常量字符串,所以const string也可以。让我们重构:

我们编写的内容适用于单个类,但随着 API 表面变大,我们可能希望将这些本地方法分组为对象——根据 单一 责任 原则—— 每个对象代表我们想要的不同服务访问。

但是因为这个LIBNAME变量现在是私有的,所以我们必须在每个类中复制/粘贴指令,这与 D on’t R epeat Y ourself原则相矛盾。所以让我们创建另一个类来为我们保存它!

导入现在看起来像这样:

不太冗长,易于阅读,易于扩展。现在我们肯定完成了,对吧?

那么,你能为最终调用那些非托管方法的特性编写单元测试吗?

因此,也许您可 以针对实际实现编写测试,因为本机库只是提供一些业务逻辑,但也许您首先拥有它的原因是因为它使您可以访问外部资源?也许没有可用的桌面版本的库,测试甚至无法在器中运行?

无论如何,这个非托管代码应该被考虑在被测单元 之外,但是您仍然需要访问它在真实代码中提供的服务。

在这种情况下,最好的解决方案通常是将服务的实现与其接口分离。

现在我们可以为测试实例化一个假的,但仍然将真实的实现用于生产!

这仍然是一个玩具示例,但是因为我们没有创建非托管对象的实例,而只是在讨论似乎是自由函数或静态方法的东西。

有时只有一个服务实例可以与之对话是有意义的,有时则不然,您需要能够动态地创建新实例。那么,我们如何从 C# 中与它们交互呢?

在 C 或 C++ 中动态创建对象时,程序将分配一些内存,在其中构造对象,并返回指向它的 指针 。

等等,别跑!没关系!

在编组指向 C# 的非托管指针时,运行时可以将其转换为IntPtr. 您可以将其视为非托管对象的不透明句柄,除了将其交还给非托管端外,您不能直接使用它做很多事情。

所以现在创建 C# 类的新实例也会创建非托管对象的新实例,然后我们可以对其进行方法调用。甜的!

我们只是忘记了一个细节:我们创建了一个 非托管 对象,这意味着 GC 不知道如何回收它,甚至默认 都不尝试!

因此,当 C# 类被垃圾回收时,让我们停止 泄漏该非托管对象。

在 C# 中,类发出需要清理步骤的信号的首选方式是实现IDisposable接口。

假设有一个函数用于销毁我们的非托管对象,它的 API 如下所示:

现在实现Dispose()非常简单:

随着这一变化,我们现在可以很好地管理我们的资源并执行必要的清理工作。

然而,既然我们已经引入了手动资源管理,我们就会冒着尝试引用已被释放的非托管对象的风险,所以让我们让它更安全!

幸运的是,C# 标准库正是我们所需要的:SafeHandle!它本来是用来保持 Win32 句柄的,但它的 API 和终结保证使它非常适合我们的目的。

从 继承时SafeHandle,需要做 3 件事。

因此,这就是SafeHandle我们示例中自定义的样子:

现在我们只需要在任何地方都替换IntPtr为 with CameraServiceHandle,除了在销毁方法中仍然需要一个IntPtr.

我们的 C# 端服务现在在内部使用句柄:

我们已经做到了!

我们现在已经从到处添加临时 static extern方法(冗长、难以测试且不一定资源安全)转变为专门设计的方法。

我们有一些小包装;它们封装良好,不会阻止对依赖它们的代码进行测试,易于添加跨平台支持,并且我们现在有系统的方法来保证与非托管对象交互时的资源和类型安全!

这就是我们在 Baracoda 如何使用 P/Invoke 的导览!

利用 P/Invoke 使我们能够编写跨平台库并与之交互,从而将我们研发团队在机器学习和计算机视觉方面的内部知识带到我们的 Unity 游戏 中!

我们计划发布更多 Unity 开发者内容,敬请期待!

托管代码和非托管代码有什么区别

广义的说,托管代码就是集成在你所使用的开发平台内的编程语言。例如:目前最常见的.Net运行库里集成了VC++,C#,VB,F#...等20多种语言的构件和处理功能。托管代码:”托管“的含义就是,这些语言的后台(隐性的)操作都由这个管理系统(.Net)完成了,你把你的编程委托给了开发平台(库)来完成。当你使用这些语言时,一些系统资源的调用、回收、编译……各种工作都由它来完成,你只需要专注于程序功能的实现即可。非托管代码:就是指不在你这个集成开发环境里,而是使用其它的开发平台写出的程序(代码)。比如说java语言(不是jscript),basic语言(不是VB),C语言(不是VC/C++/C#)等等……它们也有自己的开发平台和程序,用这些语言写出的程序就属于”非托管“。当非托管的代码在你的托管平台上运行时,你的托管平台就不能很好地处理一些后台(隐性的)操作,就需要编写额外的代码来使它们变得和谐并且安全。举个最简单的例子:C和汇编语言,它们是最早期进入计算机领域的高级语言(汇编已经不能算高级语言了:)),它们可以直接对CPU、内存、总线、I/O、硬盘等硬件进行操作(读/写),像DOS、Windows、iOs这些操作系统都是用它们写的。所以你在.Net集成环境中直接使用这些语言时,会遇到很大的阻碍,阻碍来源于所谓的”托管平台“,它认为这些操作是不安全的,就会拒绝编译和执行。但这些语言的特点是操作直接、速度奇快(跟托管平台比),而且专用性和针对性极强,当我们需要运行具有上述特点的程序时,C和汇编可以说是最理想的语言了。要想让它们和托管平台”和平共处“的话,就需要编制额外的代码让它们符合这个托管平台的安全和管理规范,还需要有非常高深的编程功底。要不然等待我们的就会有两种结果:一是程序无法运行、二是直接造成软件或硬件的损坏(底层操作是可以损伤硬件的)。我解释清楚了吗?

托管和非托管是什么意思

托管代码 :由公共语言运行库环境执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为;非托管代码:在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;非托管代码与托管代码不同,托管从公共语言运行库中获得这些服务。非托管代码在公共语言运行库环境的外部,由操作系统直接执行的代码。

到底什么是托管代码 什么是非托管代码

托管的 指 .net平台运行 程序,只有c++可以生成本地代码,也就是非托管的,其他的语言都不行。这样理解就可以了,托管的就是.net framework平台程序, 因为程序的内存分配等操作都由 。net framework接管, 而不是由windows系统直接管理。

C#调用C++的DLL时,使用非托管和托管的区别

所谓托管代码,那就是由运行时自动处理内存的,如C#写的(非安全性的除外)都是托管代码。有垃圾回收机制来对内存进行管理。你调用C++的,那这个一定是非托管代码,.net运行时无法对PINVOKE的代码进行内存管理。需要你自己对内存进行回收。 C++的dll还要调用其他dll时,这个也是非托管的。

托管和非托管的c++是什么意思,有什么区别

所谓托管就是在虚拟机中运行的.net程序。非托管就是直接运行的普通可执行程序。托管C++指的C++/CLI 很少会有人用,和C++差异比较大

~~~托管和非托管的区别

其实整个.net项目都是运行在.netframework上的托管代码,这个道理和java虚拟机的机制是类似的。最简单的说呢,受托管的代码不能直接写内存,是安全的,而非托管代码是非安全代码,可以使用指针操作内存。一般的项目使用托管代码都行了,也就是说在程序里面不需要用到非安全代码。对于一些对速度要求高的部分功能可以考虑使用非安全代码,使用指针等读写内存,而对于真个项目来说还是受托管的安全代码。

托管代码与非托管代码的区别

1简单的说,就是代码被编译成MSIL后在.net的Framework下运行,同操作系统底层的交互都交给framework去做。所谓非托管代码就是脱离了Framework的管制,直接同底层API打交道,自己管理自己的内存和安全机制等东西。而托管代码就不管这些,全都由Framework去完成 2“程序”一般都是在对操作系统进行直接或者间接的操作 “托管程序”是需要通过访问公共语言运行时(cls)才能访问操作系统的程序 而“非托管程序”不用通过访问公共语言运行时(cls)可以直接访问操作系统的程序 3vb.net,C#等写的程序是托管程序,VC++可以写托管程序,如果用到了内存管理,则只能编译为非托管程序这些东西MSDN上都写得很清楚的,如果真想深入了解的话LZ可以看看CLR via C#、.net框架设计、Effective C#之类的书籍

关于托管代码与非托管代码,编程语言调用和非托管代码与托管代码混合编程的问题c++.net c#.net的介绍到此结束,希望对大家有所帮助。

托管代码与非托管代码(编程语言调用和非托管代码与托管代码混合编程的问题c++.net  c#.net)

本文编辑:admin

本文相关文章:


托管代码与非托管代码(托管和非托管的c++是什么意思,有什么区别)

托管代码与非托管代码(托管和非托管的c++是什么意思,有什么区别)

本文目录托管和非托管的c++是什么意思,有什么区别托管代码与非托管代码的区别托管和非托管是什么意思托管代码和非托管代码有什么区别C#调用C++的DLL时,使用非托管和托管的区别使用 P/Invoke 从 Unity 高效地与非托管代码对话~

2024年7月20日 09:44

更多文章:


bootstrap table添加操作(如何使用JS在`bootstrap-table`生成的`lt;td>标签中添加`data`属性)

bootstrap table添加操作(如何使用JS在`bootstrap-table`生成的`lt;td>标签中添加`data`属性)

其实bootstrap table添加操作的问题并不复杂,但是又很多的朋友都不太了解如何使用JS在`bootstrap-table`生成的`lt;td>标签中添加`data`属性,因此呢,今天小编就来为大家分享bootstrap table

2024年8月25日 00:40

电脑哪里可以打代码(lenovo笔记本电脑怎么输代码)

电脑哪里可以打代码(lenovo笔记本电脑怎么输代码)

大家好,今天小编来为大家解答以下的问题,关于电脑哪里可以打代码,lenovo笔记本电脑怎么输代码这个很多人还不知道,现在让我们一起来看看吧!本文目录lenovo笔记本电脑怎么输代码在哪里输入电脑代码电脑打代码所有的符号在哪惠普笔记本怎么敲代

2024年7月31日 17:35

虚析构和纯虚析构函数(虚析构函数的介绍)

虚析构和纯虚析构函数(虚析构函数的介绍)

本文目录虚析构函数的介绍c++为何基类的析构函数要么定义为保护的公有成员函数,要么定义为虚函数,或是纯虚函数虚拟析构函数的作用,虚拟析构函数与虚构函数说的是一个意思吗虚析构函数的问题详细的解释下类的封装性,抽象性,继承性和多态性我是新手,问

2024年7月22日 00:38

gauge什么意思及同义词?gauge和yardstick和criterion和standard的区别

gauge什么意思及同义词?gauge和yardstick和criterion和standard的区别

本文目录gauge什么意思及同义词gauge和yardstick和criterion和standard的区别gauge翻译是什么意思gauge是什么单位gauges是什么意思gauge,stander,yardstick的区别gauge是什

2024年7月23日 19:17

小米浏览器开启javascript(小米浏览器电脑版怎么设置)

小米浏览器开启javascript(小米浏览器电脑版怎么设置)

这篇文章给大家聊聊关于小米浏览器开启javascript,以及小米浏览器电脑版怎么设置对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录小米浏览器电脑版怎么设置小米浏览器本页面禁止访问怎么解决小米设置找不到javascriptm

2024年9月1日 15:00

laravel常用的中间件(为什么laravel 中间件获取不到请求路径)

laravel常用的中间件(为什么laravel 中间件获取不到请求路径)

各位老铁们,大家好,今天由我来为大家分享laravel常用的中间件,以及为什么laravel 中间件获取不到请求路径的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们

2024年8月15日 10:50

western怎么读(Western这个单词怎么读)

western怎么读(Western这个单词怎么读)

本文目录Western这个单词怎么读westernfood怎么读west和western的区别western怎么读westenr怎么读,求语音,中文谐音,音标看不懂Western这个单词怎么读western 英 复数:westernswe

2023年11月25日 17:40

安卓是基于java开发的吗(安卓开发一定要用 Java 吗,其他语言开发方便吗)

安卓是基于java开发的吗(安卓开发一定要用 Java 吗,其他语言开发方便吗)

本文目录安卓开发一定要用 Java 吗,其他语言开发方便吗安卓是为了java开发还是java为了安卓开发安卓是基于java么安卓是用c++.开发还是java安卓软件基于什么开发安卓开发一定要用 Java 吗,其他语言开发方便吗安卓开发我认为

2024年6月4日 15:42

前端技术栈有哪些?前端和Web前端有什么区别吗

前端技术栈有哪些?前端和Web前端有什么区别吗

本文目录前端技术栈有哪些前端和Web前端有什么区别吗前端和后端哪个学的东西多大前端的完整技术栈包括哪些Web 前端的技术栈是怎样的顺丰科技的web前端工程师使用的技术栈是怎样的前端有哪些技术栈web前端是干嘛的前端技术栈有哪些给大家介绍下w

2024年6月26日 19:16

打卡小程序怎么做(钉钉考勤打卡小程序怎么添加)

打卡小程序怎么做(钉钉考勤打卡小程序怎么添加)

大家好,打卡小程序怎么做相信很多的网友都不是很明白,包括钉钉考勤打卡小程序怎么添加也是一样,不过没有关系,接下来就来为大家分享关于打卡小程序怎么做和钉钉考勤打卡小程序怎么添加的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧

2024年7月23日 09:27

安卓最大的破解资源网(安卓有哪些好的破解游戏平台)

安卓最大的破解资源网(安卓有哪些好的破解游戏平台)

本文目录安卓有哪些好的破解游戏平台有哪些优秀的安卓游戏平台,比如taptap有那些网站能下载单机破解游戏安卓有哪些好的破解游戏平台你好,我是电竞毒瘤,下面有请我的回答这个问题。安卓有哪些破解游戏平台多玩我的世界盒子我的世界这个游戏相信大家都

2024年6月6日 10:10

中文网上商城模板(网上商城如何进行开发建设)

中文网上商城模板(网上商城如何进行开发建设)

本文目录网上商城如何进行开发建设网上商城模板有哪些网上商城解决方案系统模块有哪些想找个中英文版的网店系统模版!网页设计【简单的商城页面】网上商城如何进行开发建设在如今这个互联网时代里面,很多人都舍弃了过去那种线下购物的方式,而是选择了线上交

2024年7月20日 18:16

java development kit(java jdk全称是什么是什么意思)

java development kit(java jdk全称是什么是什么意思)

本文目录java jdk全称是什么是什么意思java development kit是什么意思Java SE Development Kit 7u25 Demos and Samples和JDK的区别java 的 ide跟 jdk是一样的吗

2024年7月12日 09:06

sql数据库还原步骤(怎样还原SQL Server2000数据库的.bak文件)

sql数据库还原步骤(怎样还原SQL Server2000数据库的.bak文件)

这篇文章给大家聊聊关于sql数据库还原步骤,以及怎样还原SQL Server2000数据库的.bak文件对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录怎样还原SQL Server2000数据库的.bak文件还原数据库怎么操作

2024年8月17日 03:41

plsql32位下载(plsql没有oracle选项)

plsql32位下载(plsql没有oracle选项)

本文目录plsql没有oracle选项32位plsql连接64位oracle 使用命令窗口出错plsql必须用32位oracle客户端吗plsql没有oracle选项按照如下步骤处理,其中“将系统的tnsnames.ora拷贝到该目录”,我

2024年7月4日 00:01

html语言代码程序以什么开头(网页源文件中的代码是不是必为<html>开头)

html语言代码程序以什么开头(网页源文件中的代码是不是必为<html>开头)

本文目录网页源文件中的代码是不是必为开头html语言代码程序以什么开头HTML语言和C语言有区别吗html文件以什么开头HTML源代码是什么请问网页开头一句代码是什么意思有什么用HTML语言代码程序以开头是对还是错HTML语言代码是以什么结

2024年7月10日 07:56

today()函数的使用方法(电子表格如何利用函数表示系统当前日期)

today()函数的使用方法(电子表格如何利用函数表示系统当前日期)

本文目录电子表格如何利用函数表示系统当前日期怎么使用日期函数year()和today()Excel中today函数的使用方法及日期计算应用excel2010如何使用TODAY函数EXCEL中函数TODAY()的用法是什么谁能告诉我excel

2024年7月16日 07:29

span字体居中(如何让span中的文字水平居中)

span字体居中(如何让span中的文字水平居中)

本文目录如何让span中的文字水平居中怎样让span里面的文字能够垂直居中如何让span中的文字水平居中style="text-align:center;line-height:18px;" 水平居中text-align:center; 设

2024年6月25日 05:50

bound to是什么意思(be bound to 做什么成分)

bound to是什么意思(be bound to 做什么成分)

本文目录be bound to 做什么成分“be bound to do”是什么意思高中英语问题:be bound to 和can 的区别be bound to, be liable to,be apt to 区别be bound to有前

2024年6月17日 19:24

vba控件制作excel录入系统(如何使用VBA控件将文本文件导入EXCEL表格)

vba控件制作excel录入系统(如何使用VBA控件将文本文件导入EXCEL表格)

大家好,vba控件制作excel录入系统相信很多的网友都不是很明白,包括如何使用VBA控件将文本文件导入EXCEL表格也是一样,不过没有关系,接下来就来为大家分享关于vba控件制作excel录入系统和如何使用VBA控件将文本文件导入EXCE

2024年8月23日 16:25

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2342
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1735
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1168
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1164
标签列表

热门搜索