首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SWIG 官方文档第四部分 - 机翻中文人肉修正

,没有使用枚举值执行类似检查的自动方法。...但是,如果您的意图是将任意数量的参数传递给真正的 printf(),则调用堆栈的两个参数配置显然是完全错误的。不用说,这行不通。 不幸的是,刚刚描述的情况正是包装器生成工具面临的问题。...此外,SWIG 的默认行为是将 void * 值作为参数传递给函数。因此,如果需要,您可以使用指针来保存有效的参数值。...这可以防止程序将伪造的格式字符串传递给扩展。然后,传递的输入对象被解码并放置在为 (...) 参数定义的 void * 参数中。...代理方法将返回basetype (C#)。 • 843. 没有为类型(C#)定义 csconstruct类型映射。 • 844.

5.4K40

2019-11-12-C++CLI的枚举在C#中看不见

最近在搞C++/CLI,发现我在其中写的enum居然不见了,这个是怎么回事呢。 ---- 首先我们在C++/CLI项目里面建立一个enum ?...当我们将其在c#项目中引用时,神奇的事情发生了,这个枚举的枚举值不见了。 ? 现在我们试着给枚举值做一点改变,加一个class ? 枚举又正常了。 ?...实际上在C++/CLI中我们可以定义两种枚举类型,不加class关键字的是标准C++枚举,加class关键字的是托管枚举或者叫做CLR枚举。...对于C++/CLI来说,作为一种跨边界语言,能够轻松的在托管和非托管语言中自由切换,但是对于C#项目(.NET)项目来说,必须使用CLS兼容的托管枚举。...---- 参考文献: visual studio - C++/CLI enum not showing up in C# with reference to C++/CLI project - Stack

71420
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Unity3d底层数据传递分析

    我们知道Unity3d底层是C++完成的,而C#代码会被编译成CIL(Common Intermediate Language),连接两部分的技术就是MonoRuntime。...二 封送 在C#中的string,通过内部调用传给C++时,会使用MonoString* ,它是指向托管堆对象的字符串类型指针,这个转换就是封送(Marshalling)。...托管类数据拷贝到刚申请的非托管内存中。 3. 调用非托管方法时,使用上面的非托管内存数据,而不是原始托管内存数据。这样做是为了,当GC发生时,非托管内存是可用的。 4. 将非托管内存拷回托管内存。...内部调用 内部调用是在C++中注册调用,并直接访问托管对象,控制Marshall。例如,我们要返回字符串,就先要在C++中显示注册接口。 ? 然后在C#中声明下面的函数: ?...四 内存分配 类与结构体 对于托管代码与非托管代码,类与结构体有不一样的传递方法。 1、类的传递 类是在托管堆上分配的,因此不能以值类型传给非托管代码,而只能传引用。

    1.4K20

    听 GPT 讲 Deno 源代码 (13)

    例如,resolve_version方法用于根据模块的名称和版本号解析出具体的版本,并以URL的形式返回,to_directory_name方法用于将模块的名称转换为文件路径。...它包含了一些必要的参数,如npm的访问令牌、npm仓库的URL等。通过实例化该结构体并传递给create方法,可以创建一个ByonmCliNpmResolver的实例。...它通过create方法创建,并接受CliNpmResolverByonmCreateOptions作为参数进行初始化。...write_lock:将锁文件写入到NPM缓存目录中。 get_cache_control_query:根据给定的URL,获取NPM缓存策略的查询参数。...N-API(Node-API)是一个跨平台的Node.js C/C++编程接口,它提供了一种稳定的编程接口,使得开发者可以使用C/C++编写扩展,与Node.js的JavaScript环境进行交互。

    9010

    Unity3d底层数据传递分析

    我们知道Unity3d底层是C++完成的,而C#代码会被编译成CIL(Common Intermediate Language),连接两部分的技术就是MonoRuntime。...[1.png] 二、封送 ---- 在C#中的string,通过内部调用传给C++时,会使用MonoString* ,它是指向托管堆对象的字符串类型指针,这个转换就是封送(Marshalling)。...托管类数据拷贝到刚申请的非托管内存中。 调用非托管方法时,使用上面的非托管内存数据,而不是原始托管内存数据。这样做是为了,当GC发生时,非托管内存是可用的。 将非托管内存拷回托管内存。...[4.png] 然后在C#中声明下面的函数: [5.png] 最后实现在C++中实现这个函数: [6.png] 通过MonoString和mono_string_new,即完成了字符串的Marshalling...四、内存分配 ------ 类与结构体 对于托管代码与非托管代码,类与结构体有不一样的传递方法。 1、类的传递 类是在托管堆上分配的,因此不能以值类型传给非托管代码,而只能传引用。

    3.6K21

    C#调用C++动态库接口函数和回调函数

    前言 需求: 当前C++已经写好了一个动态库,完成了产品开发需求,C#需要调用C++编写的动态库DLL接口,开发出完整的软件,DLL动态库里包含了普通接口函数,回调函数。...:%s\n", buff); std::cout << "字符串:"<<buff <<std::endl; } 这里写了两个函数,分别演示传参和带返回值的接口函数使用方法。...下面来至百度百科的解释: 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。...\n"); } 这是C++端编写的一个回调函数设置函数,C#调用这个函数将函数指针传递过来,C++通过传递过来的函数指针反过来主动调用C#的方法,实现数据交互。...void Main(string[] args) { //调用C++设置回调函数的接口,将C#的函数地址传递过去 Set_DebugCallBackFunction

    2.8K30

    WinRT开发语言的功能和效率

    C++ lambda的传值 和作用域问题,其他的和C#的没区别: static bool IsPrime(int n) { if (n%2 == 0) return false...9 9 9 8 9 并行 3 2 3 2 2 第三种场景,将C++算法包装在动态连接库Dll中,在C# WinRT App中通过 PInvoke来调用,执行结果如下(单位毫秒): 执行次数 1(启动...(启动) 2 3 4 5 普通 8 8 8 9 9 并行 2 3 3 2 3 第五种场景,将C++算法包装在Windows Runtime Component(WRC)中,在C# WinRT App中调用...对于全新项目,在有经验的情况下,追求极致性能的首先首当其冲是 C++,如果考虑到经验和掌控,可以选择使用C++做底层,选择相对容易上手 的 C#/VB或者HTML+JS做界面的方法;如果项目工期要求很紧...,或者从老系统迁移,那 么这时候更多的考虑是使用已有资源,直到性能瓶颈的时 候才采取措 施——以C++重写性能瓶颈来解决,当然,如果没有C++经验,也可以考 虑使用C#/VB来 实现WRC以包装核心逻辑

    1.1K60

    SWIG 官方文档第二部分 - 机翻中文人肉修正

    例如,C++ 编译器不会编译任何尝试使用 int 作为传递给f的参数类型的代码: C++struct NoInt { void f(double i); void f(int) = delete...name 必须是尚未使用的有效标识符。当一个指针被包装为一个类时,“类”可以透明地传递给任何需要该指针的函数。...然而,参数转换细节和暴露给解释器的公共 API 各不相同。 9.4.3 STL 异常 许多 STL 包装函数添加了参数检查,如果值无效,将抛出依赖于语言的错误/异常。经典的例子是数组边界检查。...所述%异常指令可以用于通过将下面的代码来被包装的任何其他方法或库之前: C++%include "exception.i" %exception { try { $action } catch...这种方法意味着该类型的任何实例化都可以通过值、引用、指针或作为智能指针传递给采用该类型的方法。感兴趣的读者可能想查看生成的代码,但是,用法很简单,不需要与目标语言不同的处理方式。

    2.3K20

    .NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

    什么是跨语言和跨平台 跨语言:即只要是面向.NET平台的编程语言((C#、Visual Basic、C++/CLI、Eiffel、F#、IronPython、IronRuby、PowerBuilder...比如我在vb中写了一个针对String的首字母大写的扩展方法,将其编译后的dll引用至C#项目中。...,如C#调用C++代码,C++抛出一个string类型的异常),在C#2.0之前Catch(Exception)是捕捉不了的,但之后的版本可以。...于是你对其它人这样说,我总结出了一门语言很多必要的东西如两种主要类别:值类别和引用类别,五个主要类型:类、接口、委托、结构、枚举,我还规定了,一个类型可以包含字段、属性、方法、事件等成员,我还指定了每种类型的可见性规则和类型成员的访问规则...所以有的时候你见到的书籍或文章有的只提起CTS,有的只提起CLI,请不要奇怪,你可以宽泛的把他们理解成一个意思,CLI是微软将CTS等内容提交给国际组织计算机制造联合会ECMA的一个工业标准。

    98541

    读书笔记 dotnet 的字符串在内存是如何存放

    # 和 C++\CLI 的应用来进行测试 本文将完全采用 .NET 6 进行编写,分别创建 .NET 6 的 C# 控制台程序,和 .NET 6 的 C++\CLI 空项目。...这里需要稍微说明的是 C++\CLI 是通过 C++ 编写的 .NET 应用程序,基于 .NET 运行时运行的程序 在 C++\CLI 项目里面添加一个叫 Foo 的类,在类里面添加一个方法,用来输出字符串的内容...当然了,在 C++\CLI 项目里面依然是不推荐使用 iostream 进行输出的 那以上的 PtrToStringChars 是通过什么魔法进行实现的?...OffsetToStringData 属性获取相对于字符串类型的地址的实际字符存放地址 尝试在 C# 项目里面调用刚才定义的 Foo 类型的 Output 代码,方法如下 class Program...关于 GetPinnableReference 请参阅 C#7.3 新增功能 - 张传宁 - 博客园 更改 C++\CLI 代码如下 void JuyurchelhiLewecujai::Foo::Output

    71750

    2019-11-22-C++CLI的Ref和Out使用

    最近在搞C++/CLI,发现经常需要涉及Ref和Out的使用,因此记录下。 ---- C++/CLI 是一种.NET语言,因此其可以像C#一样使用Ref和Out为函数参数进行标识。...首先我们看看Ref,这个是表示对对象的地址进行传递,所以很简单传递一个地址符号即可 ? 我们将这个方法引用到一个C#项目中,可以看到vs帮我们加上了ref关键字 ?...首先我们需要知道的是,CLR层面是没有out这个用法的,他的本质还是ref,只是对于C#等编译器来说,将其设置为out。...所以回到C++/CLI只需要在原来的方法中添加一个[ Runtime::InteropServices::Out ]Attribute即可(注意大小写,这里编译器不会提醒,别问我怎么知道的,都是泪) ?...看变成out了 此外需要注意的一点,如果你的ref或者out参数是由外部方法的参数传入的,需要确保整条链路上的ref或者out一致,否则会出现编译错误 ---- 参考文献: .net - ref and

    78120

    值传参、指针传参、引用传参区别

    在C中,我们只了解到有两种传参方式,一种是值传递,另外一种是传递指针,一般情况下我们选择使用指针传递参数。在C++中,又新增了一种传参方式,那就是引用(type &),引用传参给我们带来了更好的体验。...那三者的具体区别在哪里呢? 1、值传递 值传递是一种值拷贝的操作,一般只用于传入参数使用,而且如果传入的值体积过大(比如一个结构体),在函数压栈的过程中会拷贝一份压入栈中,会影响效率。...2、指针传递 指针则解决了上面的两个问题,首先指针在32位系统下(64位系统是8字节)只有4个字节,无论数据多大,只要你将其指针传递给传输在压栈过程中只需要压一个4个字节的指针。...在传递给函数时相当于包装了原变量指针的地址传递给函数,可以理解为在函数中直接使用原变量进行操作,而且这个期间不会出现拷贝的行为。引用的本质是指针,C++对裸露的内存地址(指针)作了一次包装。...// swap(&x, &y); // 传引用 swap(x, y); cout << x << “–” << y << endl; getchar(); return 0; }

    78840

    C#基础知识大总结(在C语言的基础上)

    前言 本文为C#基础知识,是在有一定C语言或C++基础上进行的总结,因此会省略许多C语言的基础知识,但是对一些C#特有或者是C语言中比较少见或重要的知识也会归纳到博文里。...= playerType.ToString(); Console.WriteLine(str); // string转为枚举 // Parse后 第一个参数:你要转为的是哪个 枚举类型 第二个参数:...//求n个整数和的函数 static int Sum(params int[] arr) {     //利用for循环求数组内的数字和即可 } //调用时 Sum(1,2,3,4,5,6);//可以传任意多个参数...2.参数默认值 有参数默认值的参数一般称为可选参数 当调用函数时可以不传入参数,不传就会使用默认值 如果要混用 那么可选参数必须写在普通参数后面 static void Speak(string str...    void Speak()     {         //可以使用前面声明的变量     } } 1.访问修饰符 修饰结构体中的变量和方法 能否被外部使用 public是公共的  private

    23520

    WinCE中解决“图片采集及压缩”问题的开发历程

    虽然那个DLL驱动可以供C#调用,但是看那个驱动DLL的方法,在使用提取数据的那个函数的时候,必需要设置内核模式,而这个只能用C++来做,因为需要引用一个头文件中的某个函数,显然C#是没有头文件这个概念的...于是这个时候的计划就是,用C++来写DLL程序,将致远公司提供的硬件层的驱动再封装一遍(把那个内核模式的设置函数封装进去),然后提取出图片数据,然后再用C#调用得到图片数据,保存到一个BYTE数组中,然后通过...将图片的处理都放在内存中处理,最后也是在内存中将数据流传递给C#主程序。...然后又开始了对IStream的使用方法进行研究,发现,经过那个函数后,IStream的大小变成了图片的大小 ,但是却读不出数据,我以为是因为ISream作为传出参数,但是不是传的指针的地址,可能有问题。...最后到网上找到了一个C#中的一个可以“模拟”指针的方法IntPtr,可以实现非托管内存数据和托管内存数据之间的读取的转换,也就是所谓的内存操作。这个可以和C++中的动态分配内存相对应起来。

    1.3K20

    C++反射 - 反射信息的自动生成

    本文将结合笔者的项目经验, 介绍如何在C#中用一种逐层处理的方式完成前文中提到的反射注册信息的自动生成的. 1....版的需求, 所以选择了最方便的微软独有的c++/cli来作为bridge的中间语言....注意ClangSharp.Interop中的部分代码也是由它来生成的. - ClangSharp.Interop - libclang 与 libClangSharp C++库的C#包装, 我们可以认为这部分是...有过cmake等build system使用经验的同学, 对1, 2, 3相关的过程应该都非常熟悉, 后面我们也会看到ClangSharp中相关步骤唯一的差别是我们并不是将命令行参数传给命令行, 而是传给了一个.... 10.2 c++侧的包装 - 借助宏 当然, 考虑到业务层使用的规整性, 我们使用宏对annotate做了一些包装: #if defined(CLANG_GENERATOR) #define

    5.2K20

    C++反射:反射信息的自动生成!

    导语 | 本文将结合笔者的项目经验,介绍如何在C#中用一种逐层处理的方式完成前文中提到的反射注册信息的自动生成的,希望为更多感兴趣的开发者提供一点经验和帮助。...本文将结合笔者的项目经验,介绍如何在C#中用一种逐层处理的方式完成前文中提到的反射注册信息的自动生成的。...c++/cli来作为bridge的中间语言....其实从上面的代码不难理解libClangSharp的封装思路,区别于仅对libclang的C接口进行导出,libClangSharp还使用llvm相关的c++接口对相关功能进行了一次补充封装,c#中会使用到的扩展的函数和枚举都基本集中在...ClangSharp.Interop-libclang与libClangSharp C++库的C#包装,我们可以认为这部分是LowLevel的libclang C#版接口。

    3.4K30

    Gopro Ardunio控制库.2

    打开 关闭 开始抓取什么的 ---- 都是类似的功能,参数是从setting.h里面对应的 ? 一个私有变量域 ---- 有一些字段,我这个地方没有读太懂.继续读 ?...这是我们的第一个函数 ? 这样看起来有点清晰 ? 首先解决这个问题. ? ? C++变量前面加下划线和不加下划线都不会影响对变量的定义,只是风格问题,更喜欢将成员变量或者私有成员变量的前面加上下划线。...看我的画框的地方 就是一个来标识是什么相机的参数.3到4以上 ? param ? 用了一个http的参数 ?...模式切换->setting->传0进去 ? 看枚举值 ---- 枚举变量未分配初始值。默认情况下,第一个枚举成员的默认值为“0”,后续枚举成员dao值为前一个枚举成员的值(按文本顺序)加一。...枚举元素只能是标识符,而不是数字常量或字符常量。枚举在C/C++/c#中,是一个被命名的整型常数的集合, 枚举在日常生活中很常见。

    53010

    《C#图解教程》读书笔记之二:存储、类型和变量

    一、类型初窥:掀起你的盖头来   (1)C程序是一组函数和数据类型,C++程序是一组函数和类,而C#程序是一组类型声明;   (2)类型是一种模板:模板本身不是数据结构,但它详细说明了由该模板构造的对象的特征...C#的类型名称其实就是.NET类型的别名,所以使用.NET的类型名称也符合C#语法,不过并不鼓励这样做。...在C#程序中,应当尽量使用C#类型名称而不是.NET类型名称;   (4)除了上面提到的16种预定义类型外,还可以创建自己的用户定义类型,一共有6种用户定义类型可以由用户自己创建,它们是:类(Class...)、结构体(Struct)、数组(Array)、枚举(Enum)、委托(Delegate)和接口(Interface); 二、存储双雄:栈和堆   2.1 栈   (1)栈是一个内存数组,是一个LIFO...(2)栈存储几种类型的数据:某些类型变量的值(主要是值类型);程序当前的执行环境;传递给方法的参数;   (3)栈具有几种显著的特征:数据只能从栈顶插入和删除;将数据放到栈顶叫做入栈;将数据从栈顶移除叫做出栈

    44730

    SWIG 官方文档第三部分 - 机翻中文人肉修正

    下面的示例仅适用于 C#,并使用了 C# 章节中记录的一些类型映射方法名称,但它显示了一些可能的语法变体。...不支持可选参数的目标语言(例如 Java 和 C#)实际上会忽略此类型映射指定的值,因为必须提供所有参数。 一旦将默认类型映射应用于参数,后面的所有参数都必须具有默认值。...它提供了一种默认机制来处理声明了它们将抛出的异常的 C++ 方法。此类型映射的目的是将 C++ 异常转换为目标语言中的错误或异常。它与其他类型映射略有不同,因为它基于异常类型而不是参数或变量的类型。...因此,SWIG 通常可以通过引发异常而不是盲目地将值传递给底层 C/C++ 程序来防止潜在的分段错误或其他运行时问题。....); 请注意,如果您有一个名为 self 的参数,那么它也将匹配类型映射。一种解决方法是创建一个包装方法的接口文件,但为参数指定一个不同于 self 的名称。 11.17 去哪里了解更多信息?

    3.6K30

    【《Effective C#》提炼总结】提高Unity中C#代码质量的21条准则

    而《Effective C#》之于C# ,是类似《Effective C++》之于C++一样的存在。...例如特性(attribute)的参数和枚举的定义,还有那些在各个版本发布之间不会变化的值。除此之外的所有情况,都应尽量选择更加灵活的readonly常量。...你可以将某个类的所有构造函数统一成一个,并为所有的可选参数指定默认值。其他的几个构造函数调用某个构造函数,并提供不同的参数即可。...即作为标记使用的枚举值(即添加了Flags特性)应该总是将None设置为0。 PS: 此原则对应于《Effective C# Second Edition》中原则19。...将客户对内部数据成员的访问限制在一部分功能中。 4)包装器(wrapper)。提供一个包装器,仅暴露该包装器,从而限制对其中对象的访问。

    1.8K30
    领券