首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

C# —— 利用Marshal.GetDelegateForFunctionPointer 来转换一个函数指针为一个委托

上面这个结构我已经是转换成C#的对应结构了,原结构可以查看按键精灵提供的插件C++接口源代码。...,也就是一个函数指针,每个函数都一样是2个参数: typedef int (*QMPLUGIN_HANDLER)(char *lpszParamList, char *lpszRetVal); 转换为C#...delegate void Invoker(string parameters, StringBuilder returnValue); 大家注意到,有两个参数,c++原型中都是char*类型,转换为C#...原本的想法是用C++写一个桥来调用dll,不过在.net 2.0 中,框架直接提供了 Marshal.GetDelegateForFunctionPointer 来转换一个函数指针为一个委托,这就方便多拉...(pCmdInfo, cmdInfo); Invoker invoker = Marshal.GetDelegateForFunctionPointer(cmdInfo.handlerFunction

2.8K41

C# 快速释放内存的大数组

本文告诉大家如何使用 Marshal 做出可以快速释放内存的大数组。 最近在做 3D ,需要不断申请一段大内存数组,然后就释放他,但是 C# 对于大内存不是立刻释放,所以就存在一定的性能问题。...在博客园看到了一位大神使用 Marshal 做出快速申请的大数组,于是我就学他的方法来弄一个。本文告诉大家这个类是如何使用。 在使用的时候,先来看下原来的 C# 的大数组性能。...之前需要知道这是什么,其实 Marshal 就是一个提供 COM 互操作的方法。...如果想使用封装好的,请看下面的大神弄好的类 参见:C#+无unsafe的非托管大数组(large unmanaged array in c# without ‘unsafe’ keyword) - BIT...所以这时就可以使用 Marshal 做实例化池,瞬间就可以清空。 上面的方法暂时不告诉大家如何做,因为涉及到公司的使用。

1.9K20

C# 快速释放内存的大数组

本文告诉大家如何使用 Marshal 做出可以快速释放内存的大数组。 最近在做 3D ,需要不断申请一段大内存数组,然后就释放他,但是 C# 对于大内存不是立刻释放,所以就存在一定的性能问题。...在博客园看到了一位大神使用 Marshal 做出快速申请的大数组,于是我就学他的方法来弄一个。本文告诉大家这个类是如何使用。 在使用的时候,先来看下原来的 C# 的大数组性能。...之前需要知道这是什么,其实 Marshal 就是一个提供 COM 互操作的方法。...如果想使用封装好的,请看下面的大神弄好的类 参见:C#+无unsafe的非托管大数组(large unmanaged array in c# without ‘unsafe’ keyword) - BIT...所以这时就可以使用 Marshal 做实例化池,瞬间就可以清空。 上面的方法暂时不告诉大家如何做,因为涉及到公司的使用。 ----

2.9K20

C# Span 入门

本文简单告诉大家如何使用 Span 新的功能 需要知道 Span 是 7.2 才有的功能,如果在正式项目使用,建议安装 Nuget 的方式 在对内存指定的一段的处理,原来的 C# 是比较弱的,因为没有了...垃圾微软为了提高 C# 的性能,于是提供了新的类型 Span,这个类可以拿出任意数组的一段,作为一个新的 Span 列表。这样的底层就是指针,而且指针是有判断是否超过范围比 C++ 安全。...Console.WriteLine(e); } 有了这个类就不需要担心写出超过范围代码 stackalloc 如果要和 stackalloc 需要打开不安全代码 然后点击生成高级,选择 C#...申请一段内存 IntPtr ptr = Marshal.AllocHGlobal(2); try {...参考: C# - All About Span: Exploring a New .NET Mainstay 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span(一)

1.1K30

已解决C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏(含常见解决办法)

C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。 一、Bug描述 今天遇到了一个bug,C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。...情况2:调用出现问题 在C#中调用别人的DLL的时候有时候出现 尝试读取或写入受保护的内存 。这通常指示其他内存已损坏。 在传值的时候还是用指针,再在C#中做转换就好了。...("text"); IntPtr ptrRet = TestFunc1(ptrIn); string retlust = Marshal.PtrToStringAnsi(ptrRet); 自己在程序里强制释放...COM资源,调用Marshal.ReleaseComObject()方法将不再使用的对象释放掉 情况3:添加控件出现问题 很多人用C#编程的时候会碰到这个问题。...自己在程序里强制释放COM资源,调用Marshal.ReleaseComObject()方法将不再使用的对象释放掉并在可能出现异常的地方去Catch,并留下日志,转移此异常。

60610

C# Span 入门 stackallocAllocHGlobal

本文简单告诉大家如何使用 Span 新的功能 需要知道 Span 是 7.2 才有的功能,如果在正式项目使用,建议安装 Nuget 的方式 在对内存指定的一段的处理,原来的 C# 是比较弱的,因为没有了...垃圾微软为了提高 C# 的性能,于是提供了新的类型 Span,这个类可以拿出任意数组的一段,作为一个新的 Span 列表。这样的底层就是指针,而且指针是有判断是否超过范围比 C++ 安全。...然后点击生成高级,选择 C# 7.2 以上 现在可以写出这样的代码 private static unsafe void DroosorHotir() {...申请一段内存 IntPtr ptr = Marshal.AllocHGlobal(2); try {...参考: C# - All About Span: Exploring a New .NET Mainstay ---- 本文会经常更新,请阅读原文: https://lindexi.gitee.io

2.2K20

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

前言 需求: 当前C++已经写好了一个动态库,完成了产品开发需求,C#需要调用C++编写的动态库DLL接口,开发出完整的软件,DLL动态库里包含了普通接口函数,回调函数。...static void Main(string[] args) { //传入参数--测试 SetApplicationDirPath(Marshal.StringToHGlobalAnsi...("传入字符串测试..")); //打印返回值测试 Console.WriteLine(Marshal.PtrToStringAnsi(Version(...\n"); } 这是C++端编写的一个回调函数设置函数,C#调用这个函数将函数指针传递过来,C++通过传递过来的函数指针反过来主动调用C#的方法,实现数据交互。...static void CallBackFunction(IntPtr Path) { Console.WriteLine("C++传出来的回调:" + Marshal.PtrToStringAnsi

2.5K30

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券