C#动态调用C++dll有什么优点,对于内存使用方面有什么影响?

问题描述

我们都知道C#调用C++dll有两种方式:静态调用和动态调用。静态调用调用方式简单,被调用的dll会在程序加载时一起加载到内存中,如果在程序文件夹中没有dll文件,程序会报错。而动态调用调用方式复杂,需借助于API函数来完成dll的加载,卸载及方法调用,就算在程序文件夹中没有dll文件,也可以使程序不报错。另外,在很多文档中都提到动态调用方式能更加有效地使用内存。对于这点我不是很能理解,这里所说的“更加有效”是什么意思?是不是因为静态调用中程序加载时dll会一起加载进内存并一直存在于内存中,而动态调用可以人为的去加载dll,调用方法,使用完又卸载dll,这样就不会一直占用内存。另外,静态调用会导致内存泄露吗?或者说dll调用方法跟内存泄露有必然联系吗?

解决方案

解决方案二:
我也不能理解,哪篇文档提到的?
解决方案三:
动态加载,个人感觉和LAZY的效果很相似。
解决方案四:
引用1楼shingoscar的回复:

我也不能理解,哪篇文档提到的?

我也不记得在哪里见过的,但是确实有这种提法。不知道使用动态加载最大的好处是什么?
解决方案五:
你说的静态应该是简单的DllImport,动态是自行LoadLibrary+GetProcAddress+FreeLibrary。首先DllImport不是在程序加载时加载dll的,而是第一次调用DllImport定义的方法时才加载。静态的优点当然就是简单,缺点是不够灵活,比如DllImport只能使用系统默认的方式查找dll,无法在运行时自行查找;.net程序可以使用AnyCPU方式编译,同时支持x86或x64方式,而c/c++不行,DllImport无法根据当前运行环境自动加载不同的dll;用DllImport加载后无法卸载。一般,对于大部分应用来说,简单的DllImport就足够。动态方式大部分是用于制作框架/类库,比如像sqlce/sqlite提供的.net库,实际是对原生c/c++写的dll的封装,如果让用户使用的时候再额外下载和部署原生的dll就很麻烦,所以最好的方式就是把原生dll嵌入.net程序集,这样用户引用就很方便。程序在运行时会从嵌入资源中释放原生dll,可以自行定义位置,比如系统temp路径下,然后LoadLibrary动态加载使用。这样,也可以做到AnyCPU方式的.net程序集在运行时自动判断环境,提供x86或x64方式的支持,用户的程序使用时就不需要限制死运行方式了。也可以使用LoadLibrary+DllImport的方式,只要在使用DllImport的方法前用LoadLibrary加载过同样名字的dll,DllImport就不会再加载了。这里不直接存在什么内存泄露的事情,无论哪种,加载dll一般都是一次性的事,不会一直不停加载。也没有什么有效利用内存的说法,DllImport本身也要通过LoadLibrary+GetProcAddress,在内存方面没什么区别。只不过LoadLibrary方式可以自己拿到handle,如果需要可以FreeLibrary卸载,不过这应该没多少应用场景。

时间: 2024-09-20 10:36:28

C#动态调用C++dll有什么优点,对于内存使用方面有什么影响?的相关文章

C#实现动态调用Windows DLL

调用方法: object obj = WinDllInvoke("Kernel32.dll", "Beep", new object[] { 750, 300 }, typeof(void)); 函数代码: 1 [System.Runtime.InteropServices.DllImport("kernel32")] 2 private static extern IntPtr LoadLibrary(string lpLibFileName)

在C#中动态调用native dll的导出函数

动态|函数 在 C++ 中我们能够通过 LoadLibrary,  GetProcAddress 来动态调用 dll 的导出函数.在 C# 中也能够用这样的方式吗?在 DotNet 2.0 里面这样是可以的, 这完全得益于 2.0新增的一个函数Marshal.GetDelegateForFunctionPointer 方法 此方法在 .NET Framework 2.0 版中是新增的. 将非托管函数指针转换为委托. 实例代码如下: public delegate int MsgBox(int h

VB.NET动态调用某个DLL中的函数

问题描述 可能标题不能表达我实际要表达的意思.是这样的,在程序中需要调用一个特殊的dll中的函数这个dll中有类似A_1A_2...A_20这样的函数,有没有办法直接一个循环语句把这20个函数调用一次啊一些脚本编程语言里面就有类似的eval的功能不知道vb.net可以不? 解决方案 解决方案二:纠结能不能写字符串当作函数名,对你来说,有多大意义吗?能成为一个软件设计师?解决方案三:在.net系统中,这类程序,如果一个工作了8年的程序员,面对一个2万行的.主要由他设计开发的系统,其中有几行代码需要

在 C# 中动态调用 native dll 的导出函数

在 C++ 中我们能够通过 LoadLibrary,  GetProcAddress 来动态调用 dll 的导出函数.在 C# 中也能够用这样的方式吗?在 DotNet 2.0 里面这样是可以的, 这完全得益于 2.0新增的一个函数Marshal.GetDelegateForFunctionPointer 方法 此方法在 .NET Framework 2.0 版中是新增的. 将非托管函数指针转换为委托. 实例代码如下: public delegate int MsgBox(int hwnd,st

C#程序实现动态调用DLL的研究

原文:C#程序实现动态调用DLL的研究 C#程序实现动态调用DLL的研究 摘  要:在<csdn开发高手>2004年第03期中的<化功大法--将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决"DLL Hell"提供了一种解决方案.这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也

动态电用dll出错-动态调用Dll出错,服务模式

问题描述 动态调用Dll出错,服务模式 用MFC开发一个服务程序,服务程序在应用模式下,动态调用dll正常,然而变成服务模式,会导致服务停止.请问这是怎么回事,请大神指点. 解决方案 主要是你服务运行情况下,进程权限会变高,同时不能直接访问一些用户目录等.服务运行在SESSION0,这个可能会导致你的DLL处理有问题.你需要检查一下DLL的内部代码逻辑 解决方案二: http://www.cnblogs.com/duanshuiliu/archive/2012/07/05/2577402.htm

vb动态调用DLL的问题

问题描述 一个连接接口DLL,正常调用时先注册DLL文件,vb中引入,创建对象都没问题:DimobjCommAsHsCommX.Comm'定义对象objComm=CreateObject("HsCommX.Comm")objComm.Create()'创建对象----但这种方式在多线程调用的情况下性能就会急剧下降.目前是想改成动态调用的方式,在不同的目录下放置多个DLL,但在VB.net里实在不知道怎么实现常使用反射,DimAssDLLAsAssemblyAssDLL=System.R

python能否调用c++/cli的动态库(dll)

问题描述 python能否调用c++/cli的动态库(dll) 真心日了狗,有一个c#的dll,python无法直接调用c#的dll,于是想先让c++调用c#的dll,但是这需要使用c++/cli来实现,那么这样生成的c++/cli的dll,python能否调用... 解决方案 http://www.cnblogs.com/yinhaiming/articles/1599090.html 解决方案二: 楼上回答的很详细了,感觉可行,楼主试下! 解决方案三: 动态库DLL的调用调用本地方法(Dll

动态调用dll-C#如何动态调用VB编译的dll里的函数

问题描述 C#如何动态调用VB编译的dll里的函数 有一个VB的工程项目,里面有很多类,每个类里都有相同的函数: 比如 a工程:类模块里有 b类,c类:而b类和c类都有相同的函数d: 我怎么在C#里动态调用b类的d函数呢? 因为是动态调用,所以不能是直接引用dll,再"对象名.函数名": DLLImport和反射都尝试过,关键是我要定位到某个类的那个函数,就不知道怎么弄,麻烦大神帮帮忙